2009-10-19 144 views
35

我似乎無法記住此查詢!基於另一個表刪除表中的所有行

我想刪除表1中ID與表2相同的所有行。

所以:

DELETE table1 t1 
WHERE t1.ID = t2.ID 

我知道我可以做一個WHERE ID IN(SELECT ID FROM表2),但我想要做的儘可能使用一個加入該查詢。

+0

爲什麼你想要做一個加入? – tster 2009-10-19 20:09:24

+0

你打算如何處理這個問題:http://stackoverflow.com/questions/1590709/how-to-mark-counted-rows-as-deleted-contind-from-previous-question – 2009-10-19 20:10:38

+0

因爲連接通常更快。 – HLGEM 2009-10-19 20:10:52

回答

43
DELETE Table1 
FROM Table1 
INNER JOIN Table2 ON Table1.ID = Table2.ID 
4

試試這個:

DELETE Table1 
FROM Table1 t1, Table2 t2 
WHERE t1.ID = t2.ID; 

DELETE Table1 
FROM Table1 t1 INNER JOIN Table2 t2 ON t1.ID = t2.ID; 
44
DELETE t1 
FROM Table1 t1 
JOIN Table2 t2 ON t1.ID = t2.ID; 

我總是用別名DELETE語句,因爲它可以防止意外

DELETE Table1 

在運行之前無法突出顯示整個查詢時導致。

26

ANSI SQL沒有解決方法在刪除AFAIK中使用聯接。

DELETE FROM Table1 
WHERE Table1.id IN (SELECT Table2.id FROM Table2) 

後來編輯

其他解決方案(有時執行速度更快):

DELETE FROM Table1 
WHERE EXISTS(SELECT 1 FROM Table2 Where Table1.id = Table2.id) 
+0

他的問題在最後說明他想要使用連接而不是IN子句。 – 2009-10-19 20:12:53

+0

我不認爲有可能在這種情況下使用連接... – 2009-10-19 20:16:45

0

引用MSDN T-SQL DELETE(例d):

DELETE FROM Table1 
FROM Tabel1 t1 
    INNER JOIN Table2 t2 on t1.ID = t2.ID 
3

我認爲你可能會得到如果你嘗試過,多一點的表現小號

DELETE FROM Table1 
WHERE EXISTS (
    SELECT 1 
    FROM Table2 
    WHERE Table1.ID = Table2.ID 
) 
0

刪除基於另一個表

 Delete From Table1 a,Table2 b where a.id=b.id 

    Or 

     DELETE FROM Table1 
    WHERE Table1.id IN (SELECT Table2.id FROM Table2) 

    Or 

     DELETE Table1 
    FROM Table1 t1 INNER JOIN Table2 t2 ON t1.ID = t2.ID; 
0

表記錄這是舊的,我知道,但只是一個指針使用這個屁股的引用任何人。我剛剛嘗試過,如果您使用的是Oracle,JOIN在DELETE語句中不起作用。 您會收到以下消息:

ORA-00933:SQL命令未正確結束。

+0

請參閱[對另一個問題的此答案](http://stackoverflow.com/a/1593280/1178314)爲例如如何寫入在Oracle下使用連接刪除。 – 2015-09-15 12:57:17

2

發現這個link有用

從那裏

通常情況下,一個人想基於另一個表標準從表中刪除一些記錄複製。如何刪除這些表中的一個而不刪除兩個表中的記錄?

DELETE DeletingFromTable 
    FROM DeletingFromTable INNER JOIN CriteriaTable 
    ON DeletingFromTable.field_id = CriteriaTable.id 
    WHERE CriteriaTable.criteria = "value"; 

的關鍵是,你指定表的名稱從作爲SELECT被刪除。所以,JOIN和WHERE做選擇和限制,而DELETE做刪除。不過,您不僅限於一張桌子。如果您有多對多關係(例如雜誌和訂閱者,通過訂閱加入),並且您要刪除訂閱者,則還需要從聯接模型中刪除任何可能的記錄。

DELETE subscribers, subscriptions 
    FROM subscribers INNER JOIN subscriptions 
     ON subscribers.id = subscriptions.subscriber_id 
    INNER JOIN magazines 
     ON subscriptions.magazine_id = magazines.id 
    WHERE subscribers.name='Wes'; 

刪除記錄與加盟也可以用一個LEFT JOIN和WHERE做,看看是否連接表爲空,這樣你可以刪除一個表中的記錄是沒有一個匹配(如準備添加關係。)示例文章即將推出。

2

由於OP沒有要求特定的數據庫,最好使用符合標準的聲明。 只有MERGE符合SQL標準,用於在目標表上加入某些內容時刪除(或更新)行。

merge table1 t1 
    using (
     select t2.ID 
      from table2 t2 
    ) as d 
    on t1.ID = d.ID 
    when matched then delete; 

MERGE有更嚴格的語義,從某些錯誤的情況下,其可能會被忽視與DELETE ... FROM保護。它強制匹配的唯一性:如果源中的許多行(using中的語句)與目標中的同一行匹配,則必須取消合併,並且必須由SQL引擎引發錯誤。

+0

這比delete-join構造更清潔 – asakura89 2016-01-12 10:22:19

0

雖然OP不想使用'in'語句,但在答覆Ankur Gupta時,這是我發現刪除一個表中不存在於另一個表中的記錄的最簡單方法,一對多關係:

DELETE 
FROM Table1 as t1 
WHERE ID_Number NOT IN 
(SELECT ID_Number FROM Table2 as t2) 

在Access 2016中工作就像一個魅力,對我來說。

0

我經常做類似下面的組裝例子。 (這個例子來自在Linux上運行的Informix SE。)

這個例子的意義在於刪除所有的房地產豁免/消減交易記錄 - 因爲消減應用程序有一個bug - 基於real_estate中的信息表。

在這種情況下,last_update != null表示帳戶未關閉,而res_exempt != 'p'表示帳戶不是個人財產(商業設備/傢俱)。

delete from trans 
where yr = '16' 
and  tran_date = '01/22/2016' 
and  acct_type = 'r' 
and  tran_type = 'a' 
and  bill_no in 
(select acct_no from real_estate where last_update is not null 
and res_exempt != 'p'); 

我喜歡這種方法,因爲過濾標準 - 至少對我來說 - 更容易在創建查詢閱讀,並從現在開始明白了許多個月的時候,我看着它,不知道是什麼我剛在想。

1

這將刪除所有行中Table1符合條件:

DELETE Table1 
FROM Table2 
WHERE Table1.JoinColumn = Table2.JoinColumn And Table1.SomeStuff = 'SomeStuff' 
7

PostgreSQL的實現將是:

DELETE FROM t1 
USING t2 
WHERE t1.id = t2.id; 
相關問題