- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个数据库表,其中包含一些字段和示例记录,如下所示:
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/
条件是 一科多师关系,即一科可以由多位老师教授,但一名老师只能教授一科 多学生与多科目的关系,即许多学生可以选修一门共同科目,而一个学生可以选修多门科目。 多个学生与多个批处理的关系。 不能同时保存两
我是一名优秀的程序员,十分优秀!