仅当满足所有记录的条件时选择所有记录

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”的每一行。我需要为该记录拉出所有行,只有当它满足每一行的条件时。

在我看来似乎很容易……似乎无法让它发挥作用。谢谢

Jus*_*ave 9

像这样的事情可能是最传统的方法:

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)


Ste*_*o64 7

或者为了好玩为什么不使用 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)