Join
查找表中缺少的項目
長期閱讀,第一次發帖。這似乎是一個簡單的搜尋,但我找不到我需要的答案,而那些有意義的答案並沒有給我想要的結果。
我幾乎不好意思問這個問題,因為它必須是世界上最簡單的程式碼,但我似乎無法理解?!
我有 2 個表:ContractType、Inventory
契約類型:
╔════════╦════════╗ ║ TypeID ║ InvtID ║ ╠════════╬════════╣ ║ A ║ APPLE ║ ║ A ║ ORANGE ║ ║ A ║ PEAR ║ ║ B ║ APPLE ║ ║ B ║ ORANGE ║ ║ C ║ ORANGE ║ ╚════════╩════════╝
存貨:
╔════════╗ ║ InvtID ║ ╠════════╣ ║ APPLE ║ ║ ORANGE ║ ║ PEAR ║ ╚════════╝
我似乎無法弄清楚的是如何獲取庫存中缺少項目的 TypeID 列表,如下所示:
╔═══════════╦═══════════╦══════════╗ ║ ct.TypeID ║ ct.InvtID ║ i.InvtID ║ ╠═══════════╬═══════════╬══════════╣ ║ A ║ APPLE ║ APPLE ║ ║ A ║ ORANGE ║ ORANGE ║ ║ A ║ PEAR ║ PEAR ║ ║ B ║ APPLE ║ APPLE ║ ║ B ║ ORANGE ║ ORANGE ║ ║ B ║ ║ PEAR ║ ║ C ║ ║ APPLE ║ ║ C ║ ORANGE ║ ORANGE ║ ║ C ║ ║ PEAR ║ ╚═══════════╩═══════════╩══════════╝
這是我的嘗試,我哪裡出錯了?
SELECT ct.typeid [CTTypeID], ct.invtid [CTInvtID], i.invtid [InvtID] FROM contracttype ct FULL OUTER JOIN inventory i ON ct.invtid = i.invtid
我什至不需要上面的格式,我只需要知道 B 型缺少 PEAR 和 C 型缺少 Apple 和 Pear。
在不知道從哪裡來
TypeId
的情況下,這不會是 100% 完成的。看起來數據模型中可能存在錯誤,但我知道這些通常是抽象/家庭作業問題,因此父實體可能不存在。您需要交叉連接
TypeId
並InvtId
創建所有可能的組合,然後離開連接ContractType
:SELECT tp.TypeId ,inv.InvtId ,contype.InvtId FROM ( SELECT DISTINCT TypeId FROM ContractType ) tp CROSS JOIN Inventory inv LEFT JOIN ContractType contype ON contype.TypeId = tp.TypeId AND contype.InvtId = inv.InvtId
如果
TypeId
來自另一個作為主鍵的實體,那麼您將引用它而不是SELECT DISTINCT
在子查詢中執行。