2014-07-18 19 views
1

這可能是簡單的事情,但我無法圍繞它進行包裝。我已經嘗試過,不存在,除此之外......並且似乎無法得到正確的結果。SQL:從表A中刪除表B中根據兩個字段不存在的記錄

我有兩個表。

Table A 
----------- 

BK 
NUM 

Table B 
------------ 

BK 
NUM 

如何編寫查詢以從表A中刪除基於這兩個字段不在表B中的所有記錄。因此,如果表A有一條記錄,其中BK = 1且NUM = 2,那麼它應該在表B中查找。如果表B還有一條記錄,其中BK = 1且NUM = 2,則不做任何操作,但如果不是,則刪除該記錄從表A.這有意義嗎?

任何幫助,非常感謝。

回答

4

可以這樣做

delete from tablea 
where (BK,NUM) not in 
(select BK,NUM from tableb) 

使用exists

delete from tablea a 
where not exists 
(select 1 from tableb where BK=a.BK and NUM = a.NUM) 
+1

...這應該是完全DB無關,也 –

1

另一種選擇是使用一個反連接圖案,LEFT [OUTER]加入,然後將WHERE子句中謂詞過濾掉所有匹配項。

最簡單的做法是先將它作爲SELECT編寫,然後轉換爲DELETE。

SELECT t.* 
    FROM tablea t 
    LEFT 
    JOIN tableb s 
    ON s.BK = t.BK 
    AND s.NUM = t.NUM 
WHERE s.BK IS NULL 

的LEFT JOIN返回從t所有行與匹配的行沿s。 「技巧」是WHERE子句中的謂詞...我們知道s.BK在所有匹配行上都將爲非NULL(因爲值必須滿足ON子句中的謂詞中的等式比較)。所以s.BK將只在t行這並沒有匹配的行s爲NULL。

對於MySQL,將其更改爲DELETE語句很簡單,只需將SELECT關鍵字替換爲DELETE即可。 (我們可以寫任何DELETE tDELETE t.*,無論是那些將工作。

(這是唯一一個(幾個)可能的方法的說明。)

相關問題