2012-01-07 55 views
0

需要找到子庫存記錄沒有在子庫存表的列表與子狀態1 當存在INV與地位上的列表1.其中不存在第二個表

有每部分只有一條記錄號碼爲inv,但可以在subinv中使用幾個狀態號碼中的幾個記錄。我的語句不返回任何行,顯示沒有錯誤,但有記錄符合條件。

SELECT m.partnum   
  FROM inv m, 
     subinv s  
WHERE m.status = '1' 
    AND not exists (SELECT s.partnum  
        FROM subinv s1 
        WHERE s1.substatus = '1')  
+0

這是一個有效的'EXISTS'子句,但通常與外部查詢相關聯。另外,SELECT部分​​沒有被評估 - 嘗試'EXISTS(SELECT 1/0'...如果你不相信我 - 不會被零除錯誤);另外,如果沒有加入笛卡兒積的標準... – 2012-01-07 06:05:15

回答

5

您的外部查詢,這是不好的(尤其是當你不想反正加入)笛卡兒積,和你需要指定的零件號在EXISTS查詢:

SELECT m.partnum 
    FROM inv AS m 
WHERE m.status = '1' 
    AND NOT EXISTS 
     (SELECT * 
      FROM SubInv AS s1 
     WHERE s1.substatus = '1' 
      AND s1.partnum = m.partnum 
     ); 

這爲NOT EXISTS提供了相關的子查詢。這將是值得一試的濾波OUTER性能JOIN:

SELECT i.partnum 
    FROM inv AS i 
    LEFT JOIN subinv AS s ON s.partnum = i.partnum AND s.substatus = '1' 
WHERE i.status = '1' 
    AND s.substatus IS NULL; 

的LEFT JOIN時,有與s.substatus = '1'沒有行條件將產生s.substatus一個NULL,而WHERE子句只選擇這樣的行。作爲一種轉換,它並不是非常明顯,但它可能比子查詢更快,因爲它是一個連接而不是子查詢,必須對主表inv(滿足status = '1')中的每一行執行。

+1

該聲明**是無效的。 Oracle中不允許帶有「AS」的* table *別名。您需要使用例如'FROM inv m'或'FROM inv i'。喬納森的其餘部分的答案是正確的,所以只要刪除'AS',你應該沒問題。 – 2012-01-07 10:31:30

+0

什麼是偉大的馬...感謝您的投入!謝謝Jonathan ... sans,因爲它很棒!!!!! – 2012-01-07 11:29:13

+0

這很有趣; SQL標準允許AS。我不知道Oracle不遵循標準。 – 2012-01-07 15:20:32

相關問題