[英]T-SQL How to list rows not present in table based on columns from other tables
在可能很簡單的問題上尋找一些幫助,但措辭讓我很難看到是否有人問過類似的問題。
在 SQL Server 中,我有 3 個表:
Colleague (ColleagueID (INT), Name (NVARCHAR), Branch
)Module (ModuleID (INT), Course (NVARCHAR), DueDate)
ModuleCompletion (RecordID (INT), Colleague (NVARCHAR), Module (NVARCHAR)
這是一組基於之前收集的公司存儲在 Excel 中的數據快速構建的表格,例如(同事向下 Y)和(跨 X 的模塊)的工作表矩陣,1 表示已完成,0 表示未完成。
我抓住了所有的 1 並將它們上傳到 ModuleCompletion 表以跟蹤誰完成了什么。
就目前而言,沒有鏈接表的外鍵,也沒有 UNIQUES 等。
示例表:
同事
ID Name Branch
-----------------
1 xyz HO
2 abc HO
3 tuv HO
4 efg Branch1
模塊
ID Course DueDate
-----------------------
1 Co1 2019-12-31
2 Co2 2020-01-30
模塊完成
ID Colleague Module
-----------------------
1 xyz Co1
2 xyz Co2
3 abc Co1
4 tuv Co2
我希望返回的是:
Module Branch Colleague
--------------------------
Co1 HO tuv
Co1 Branch1 efg
Co2 HO abc
Co2 Branch1 efg
結果集應該是ModuleCompletion
表中未與 Module 一起列出的每個 Branch 和同事組合。
使用:
SELECT c.Branch, c.Name
FROM Colleague c
LEFT JOIN ModuleCompletion x ON x.Colleague = c.Name
WHERE x.Colleague IS NULL
ORDER BY c.Branch, c.Name
顯示他們沒有完成任何課程的所有分支和同事姓名,例如,同事姓名從未出現在ModuleCompletion
表中,但我需要它來按模塊檢查。
任何幫助將不勝感激。
不要左連接,而是交叉連接。
from Colleague c
cross join Module m
where not exists (
select *
from ModuleCompletion mc
where c.Name = mc.Colleague
and m.Course = mc.Module
)
基本上你可以從這里開始玩
基於先前的解決方案並避免嵌套選擇,您也可以執行以下操作:
SELECT m.Course, c.Branch, c.Name FROM Collegue as c CROSS JOIN Module as m EXCEPT SELECT m.Course, c.Branch, c.Name FROM ModuleCompletion as mc INNER JOIN Collegue as c ON c.Name = mc.Colleague INNER JOIN Module as m ON m.Course = mc.Module
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.