排除结果

时间:2014-12-11 21:47:13

标签: sql sql-server

课程(一个表)和模块(另一个表)。模块可以是不同课程的一部分。加入此表名为coursemodule

CourseCode  ModuleID
       BS   BS2029
       CN   CN5485
       CS   CN5485
       BS   CS1004
       CN   CS1004
       CS   CS1004
       CS   CS2017
       BS   CS2026
       CS   CS2026

我想选择出现在CS和CN课程中的模块,但不是那些也出现在BS课程中的模块。如果我运行这个:

SELECT m.ModuleID, m.ModuleDescription
FROM Module as m
INNER JOIN (SELECT coursecode, ModuleID 
            FROM CourseModule      
            WHERE CourseCode = 'CS') AS CodeCS
ON m.ModuleID = CodeCS.ModuleID            
INNER JOIN (SELECT coursecode, ModuleID 
            FROM CourseModule      
            WHERE CourseCode = 'CN') AS CodeCN
ON m.ModuleID = CodeCN.ModuleID 

我明白了:

ModuleID        ModuleDescription
CN5485          Managing Networks
CS1004          Introduction to Programming
基于此查询的

是正确的,但我只想返回CN5485,因为CS1004也在BS课程中。

没有尝试,<>,除了变化都有可怕的成功!我需要添加什么?修改查询?

4 个答案:

答案 0 :(得分:1)

我可能会选择一些不同的东西 - 因为你想要两个“in”和一个“not in”,我会这样写,这会清楚你在做什么:

SELECT m.ModuleID, m.ModuleDescription
FROM Module as m
WHERE m.ModuleID in (SELECT ModuleID FROM CourseModule WHERE CourseCode = 'CS')
AND m.ModuleID in (SELECT ModuleID FROM CourseModule WHERE CourseCode = 'CN')
AND m.ModuleID not in (SELECT ModuleID FROM CourseModule WHERE CourseCode = 'BS')

我认为in语法比加入更清晰 - 加入我意味着你想要那个表中的东西,实际上你只是想确保匹配存在,而不是从中检索任何东西。如果你不小心,加入也会让你遇到重复问题 - in不会。

答案 1 :(得分:0)

我能想到的最简单的方法是使用3个查询。第一个查询将返回所有具有CS课程的模块,然后Intersect返回选择所有具有CN课程的模块的查询。获取Interact的结果,然后针对BS课程中的Moudles运行Except

因此查询的简化版本如下所示:

<Query to pull distinct Modules that have a CS course>
Intersect
<Query to pull distinct Modules that have a CN course>
Except
<Query to pull distinct Modules that have a BS course>

更新查询Seetal的评论

Select ModuleId, ModuleName
From Module
Where ModuleID IN (
  <Query to pull distinct ModuleID that have a CS course>
  Intersect
  <Query to pull distinct ModuleID that have a CN course>
  Except
  <Query to pull distinct ModuleID that have a BS course>
)

答案 2 :(得分:0)

您可以尝试此查询 - 易于阅读和理解:

SELECT m.ModuleID, m.ModuleDescription
FROM Module as m
WHERE m.ModuleID in 
((SELECT ModuleID FROM CourseModule WHERE CourseCode = 'CN'
INTERSECT
SELECT ModuleID FROM CourseModule WHERE CourseCode = 'CB')
EXCEPT
SELECT ModuleID FROM CourseModule WHERE CourseCode = 'BS')

答案 3 :(得分:0)

好吧,不知道你使用的是什么版本的SQL Server。如果您的版本支持,请尝试以下(except)子句:

SELECT m.ModuleID, m.ModuleDescription
FROM Module as m
INNER JOIN CourseModule cm ON (m.ModuleID = cm.ModuleID 
               AND cm.CourseCode IN ('CS', 'CN'))
EXCEPT --
SELECT m.ModuleID, m.ModuleDescription
FROM Module as m
INNER JOIN CourseModule cm ON (m.ModuleID = cm.ModuleID 
               AND cm.CourseCode IN ('BS'))

您可以尝试选择ModuleID,然后选择说明。