我有兩張桌子,第一學期和第二學期。第一學期:
| 學生卡 | 主題 ID |
|---|---|
| 美國廣播公司 | 子1 |
| 定義 | 子1 |
| 吉 | 子1 |
第二學期:
| 學生卡 | 主題 ID |
|---|---|
| 美國廣播公司 | 已更改Sub1 |
| 定義 | 子1 |
| 吉 | 改變Sub2 |
| 新學生1 | 子2 |
| 新學生2 | 子3 |
我正在嘗試撰寫一個 Select 陳述句,以便它從 Semester2中選擇具有以下內容的行:
- 新的 StudentIds - 即 Semester2 中不在 Semester1 中的 StudentIds。所以這個要求的結果應該是第二學期的
newStudent1和newStudent2行。
和
- 更改的 SubjectIds - 即第 1 學期和第 2 學期之間相同 StudentId 的 SubjectId 不同。所以這個要求的結果應該是第二學期的
changedSub1和changedSub2行。
我已經能夠撰寫兩個單獨的查詢來分別選擇 2 個要求:
-- Part 1
SELECT * FROM Semester2
WHERE StudentId NOT IN ( SELECT StudentId from Semester1 );
-- Part 2
SELECT Semester2.StudentId, Semester2.SubjectId
FROM Semester2
JOIN Semester1
ON (Semester1.StudentId = Semester2.StudentId)
WHERE Semester1.SubjectId <> Semester2.SubjectId;
如何結合這兩個查詢?或者,如果有更好/更簡單/更清晰的方法將兩個需求寫為一個查詢(不結合我上面的查詢),我該怎么做?
uj5u.com熱心網友回復:
看起來帶有外部連接的單個查詢就足夠了
select s2.*
from semester2 s2
left join semester1 s1 on s1.studentId = s2.studentId
where s1.studentId is null or s2.SubjectId != s1.SubjectId;
uj5u.com熱心網友回復:
如果 UNION 不計入“單個查詢”,您也可以使用連接在單個查詢中執行此操作:
SELECT s2.*
FROM Semester2 s2
LEFT OUTER JOIN Semester1 s1
ON s2.StudentId = s1.StudentId
AND s2.SubjectId = s1.SubjectId
WHERE s1.StudentId IS NULL;
WHERE 子句將使它只出現在 Semester1 中沒有完美匹配的結果。
uj5u.com熱心網友回復:
您可能只需要稍微擴展您的“第 1 部分”查詢。現在它排除了第 1 學期的所有學生,但您只想排除第 1 學期中沒有在第 2 學期更改科目的學生。
像這樣的東西:
SELECT * FROM Semester2
WHERE StudentId NOT IN (-- Student ids with same subject from semester 1
SELECT StudentId FROM Semester1
WHERE Semester1.SubjectId = Semester2.SubjectId);
但我沒有測驗過。如果我犯了一些嚴重的錯誤,請告訴我。
uj5u.com熱心網友回復:
一個選項需要 no UNION(需要掃描表兩次)和 noOR條件(可能很慢)和 no LEFT JOIN(這會使優化器誤以為會有多個連接行)
SELECT s2.*
FROM semester2 s
WHERE NOT EXISTS (SELECT 1
FROM semester1 s1
WHERE s1.studentId = s2.studentId
AND s2.SubjectId = s1.SubjectId
);
uj5u.com熱心網友回復:
這是我能想到的最簡單的事情。
select Semester2.*
from Semester2
left outer join Semester1
on Semester1.StudentId = Semester2.StudentId
where NULLIF(Semester2.SubjectId,Semester1.SubjectId) is NOT NULL
如果兩者相等,NULLIF 將回傳 NULL(同一個學生在兩個學期都有相同的科目)。否則回傳 Semester2.SubjectId。這完全排除了您想要排除的內容 - 第 1 學期的學生,他們在第 2 學期沒有其他科目。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/474599.html
上一篇:使用T-SQL決議XML資料
