簡體   English   中英

T-SQL 如何根據其他表中的列列出表中不存在的行

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM