gpt4 book ai didi

SQL - 让学生通过所有科目

转载 作者:行者123 更新时间:2023-12-04 00:40:11 26 4
gpt4 key购买 nike

我有一个数据库表,其中包含一些字段和示例记录,如下所示:

Name    Test    Result  Other_fields  
A English P x
B Maths F x
C English P x
B English P x
A Maths F x
D English P x
C Biology F x
A Biology P x
B Biology F x

现在实际表格包含更多种类的测试。
我想要实现的是找到通过了逗号中指定的所有测试的学生的计数/列表(以及其他字段中对学生唯一的相应值......比如他的年龄,性别等) - 分隔的字符串。该字符串显然是在运行时插入到查询中的。

现在,如果它是固定数量的测试,比如 2 个测试或 3 个测试,那么我可以为它编写一个查询。
但真正的问题是 CSV 字符串中的测试数量不固定。
有什么办法可以实现这一目标吗?

PS:如果有人计划提出涉及使用 SQL IN 的答案,我可以用一些唯一的数字(作为测试 ID)替换测试名称。

编辑

显然,我没有说清楚。该表将包含大量测试的记录(比如 test1、test2、....test100)。 CSV 字符串将包含其中的一些测试(比如 2 或 3 或 4,但绝对超过 1)。我想要学生通过 CSV 字符串指定的所有测试的数据。

编辑 2
可以有多个记录对应一个学生和一个测试的组合(多次通过和失败)

最佳答案

SELECT DISTINCT Name 
FROM Table t
WHERE NOT EXISTS(SELECT 1
FROM Table
WHERE t.Name = Name
AND Result = 'F'
AND ',' || CsvOfTests || ',' LIKE '%,' || Test || ',%'
)

我建议使用一些唯一值,例如自动递增的 ID,而不是此处的名称。如果您希望在结果集中包含其他字段,您可以将它们包含在您的 SELECT 和 GROUP BY 字段列表中或使用连接。

CsvOfTests 是您感兴趣的测试列表。我在 CsvOfTests 和 Test 的开头和结尾添加了逗号,以防一个测试的名称是其他测试名称的子字符串。但是,我不得不说,如果您将测试放入临时表而不是 csv 字符串,我觉得查询会简单得多并且不那么复杂。

如果您的输入字符串不仅仅用逗号分隔测试(比如逗号后有一个空格,您还需要包括这些)。如果它比这更复杂,那么我想我会尝试 REGEXP_LIKE 或编写我自己的函数。

每个请求计算通过主题的查询

SELECT DISTINCT Name 
FROM Table t
WHERE LENGTH(CsvOfTests) - LENGTH(REPLACE(CsvOfTests, ',')) + 1 = (
SELECT COUNT(1)
FROM Table
WHERE t.Name = Name
AND Result = 'P'
AND ',' || CsvOfTests || ',' LIKE '%,' || Test || ',%'
)

此处 LENGTH(CsvOfTests) - LENGTH(REPLACE(CsvOfTests, ',')) + 1 计算列表中的测试数。然后它只计算学生通过了多少次测试。显然还有 REGEXP_COUNT在 11g 第 1 版中执行相同的操作。

在我重新阅读并思考您的问题后,我明白这并不是您所要求的。此查询的目标更多地是检查学生是否通过了每个科目(即,如果您第一次考试不及格,那么您重新参加考试并最终通过)。

关于SQL - 让学生通过所有科目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19650975/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com