课程(一个表)和模块(另一个表)。模块可以是不同课程的一部分。加入此表名为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课程中。
没有尝试,<>,除了变化都有可怕的成功!我需要添加什么?修改查询?
答案 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
,然后选择说明。