协助SQL查询返回不匹配的单元格

时间:2016-02-27 12:22:04

标签: mysql sql database oracle11g

我有两张桌子:

表1

[schoolName] [Track] [Student Name] [Program ID]   
ABC          103     joe            1
ABC          101     Edward         2
QWE          103     Adam           5
QWE          103     Ben            1

表2

[SchoolName] [Program ID] [Class ID] [Class Name]
ABC          1            1          Science
ABC          1            2          Math
ABC          1            3          History
ABC          2            1          Science
QWE          5            1          Science
QWE          5            2          Math
QWE          1            2          Math

选择参加第103号课程的学生姓名不包括第3课,并为其班级名称返回NULL,如下所示:

[schoolName] [Track] [Student Name] [Program ID] [Class Name]
QWE          103     Adam           5            NULL
QWE          103     Ben            1            NULL

尝试以下查询但不起作用:

select Table1.[schoolName], Table1.[Track], Table1.[Student Name], Table1.[Program ID], Table2.[Class Name] 
from table1, table2 
where Table1.[schoolName]=Table2.[SchoolName] 
  and Table1.[Program ID]=Table2.[Program ID] 
  and Table1.[Track]=103
  and Table2.[Class ID] = 3 
   OR Table2.[Class ID] IS NULL

我在这里做错了什么?

1 个答案:

答案 0 :(得分:1)

首先,我非常怀疑您使用的是MySQL还是Oracle。使用[]进行引用是特定于SQL Server的。

  

选择参加第103号课程的学生姓名,不包括第3课,并为其班级名称返回NULL

您可以首先获取table1 track为103的所有记录,并使用相关子查询来消除程序包含class id = 3的行:

SELECT T1.[schoolName],
       T1.[Track],
       T1.[Student Name],
       T1.[Program ID],
       NULL AS [Class Name] 
FROM table1 T1
WHERE T1.[Track] = 103
  AND NOT EXISTS (SELECT 1
                  FROM table2 T2
                  WHERE T1.[SchoolName] = T2.[SchoolName]
                    AND T1.[Program ID] = T2.[Program ID]
                    AND T2.[Class ID] = 3);

LiveDemo

考虑使用没有空格的列名,例如Program_ID, Class_ID等等。