Sam*_*Bou 6 sql-server sql-server-2012 relational-division
抱歉,如果之前已经问过这个问题。我找不到任何例子。
我试图将学生的课程作业拉出一个学期,前提是他们在所有课程中都获得了“NA”的成绩。现在,我的代码只吸引在任何课程中成绩为“NA”的学生。我需要他们在所有课程中都有“NA”,而不仅仅是 1 或 2 门课程。
我的数据:
姓名 | 课程 | 年级 |
---|---|---|
学生1 | en101 | 不适用 |
学生1 | 马101 | 乙 |
学生1 | py102 | 一种 |
学生2 | en101 | 不适用 |
学生2 | 马205 | 不适用 |
学生2 | en206 | 不适用 |
学生3 | 马101 | 不适用 |
我正在尝试为学生提取所有行,前提是他们在所有课程中的成绩都为“NA”。
结果应该是:
姓名 | 课程 | 年级 |
---|---|---|
学生2 | en101 | 不适用 |
学生2 | 马205 | 不适用 |
学生2 | en206 | 不适用 |
学生3 | 马101 | 不适用 |
即使其他行不满足条件,我的代码也会提取等级为“NA”的每一行。我需要为该记录拉出所有行,只有当它满足每一行的条件时。
在我看来似乎很容易……似乎无法让它发挥作用。谢谢
像这样的事情可能是最传统的方法:
SELECT
Name,
Course,
Grade
FROM
myTable a
WHERE
NOT EXISTS
(
SELECT
1
FROM
myTable b
WHERE
b.name = a.name
AND b.grade <> 'NA'
)
Run Code Online (Sandbox Code Playgroud)
不太传统但可能更有效:
SELECT
Name,
Course,
Grade
FROM
(
SELECT
Name,
Course,
Grade,
SUM
(
CASE
WHEN Grade <> 'NA' THEN 1
ELSE 0
END
)
OVER
(
PARTITION BY
Name
) AS num_not_na
FROM
myTable
) a
WHERE
a.num_not_na = 0
Run Code Online (Sandbox Code Playgroud)
或者为了好玩为什么不使用 ALL 语法
SELECT
s1.Name,s1.Course,s1.Grade
FROM dbo.Students s1
WHERE 'NA' = ALL
(
SELECT a.grade
FROM dbo.Students a
WHERE s1.Name = a.Name
)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
824 次 |
最近记录: |