Join

查找表中缺少的項目

  • August 25, 2020

長期閱讀,第一次發帖。這似乎是一個簡單的搜尋,但我找不到我需要的答案,而那些有意義的答案並沒有給我想要的結果。

我幾乎不好意思問這個問題,因為它必須是世界上最簡單的程式碼,但我似乎無法理解?!

我有 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% 完成的。看起來數據模型中可能存在錯誤,但我知道這些通常是抽象/家庭作業問題,因此父實體可能不存在。

您需要交叉連接TypeIdInvtId創建所有可能的組合,然後離開連接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在子查詢中執行。

引用自:https://dba.stackexchange.com/questions/274330