我似乎無法記住此查詢!基於另一個表刪除表中的所有行
我想刪除表1中ID與表2相同的所有行。
所以:
DELETE table1 t1
WHERE t1.ID = t2.ID
我知道我可以做一個WHERE ID IN(SELECT ID FROM表2),但我想要做的儘可能使用一個加入該查詢。
我似乎無法記住此查詢!基於另一個表刪除表中的所有行
我想刪除表1中ID與表2相同的所有行。
所以:
DELETE table1 t1
WHERE t1.ID = t2.ID
我知道我可以做一個WHERE ID IN(SELECT ID FROM表2),但我想要做的儘可能使用一個加入該查詢。
DELETE Table1
FROM Table1
INNER JOIN Table2 ON Table1.ID = Table2.ID
試試這個:
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;
DELETE t1
FROM Table1 t1
JOIN Table2 t2 ON t1.ID = t2.ID;
我總是用別名DELETE語句,因爲它可以防止意外
DELETE Table1
在運行之前無法突出顯示整個查詢時導致。
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)
他的問題在最後說明他想要使用連接而不是IN子句。 – 2009-10-19 20:12:53
我不認爲有可能在這種情況下使用連接... – 2009-10-19 20:16:45
引用MSDN T-SQL DELETE(例d):
DELETE FROM Table1
FROM Tabel1 t1
INNER JOIN Table2 t2 on t1.ID = t2.ID
我認爲你可能會得到如果你嘗試過,多一點的表現小號
DELETE FROM Table1
WHERE EXISTS (
SELECT 1
FROM Table2
WHERE Table1.ID = Table2.ID
)
刪除基於另一個表
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;
表記錄這是舊的,我知道,但只是一個指針使用這個屁股的引用任何人。我剛剛嘗試過,如果您使用的是Oracle,JOIN在DELETE語句中不起作用。 您會收到以下消息:
ORA-00933:SQL命令未正確結束。
請參閱[對另一個問題的此答案](http://stackoverflow.com/a/1593280/1178314)爲例如如何寫入在Oracle下使用連接刪除。 – 2015-09-15 12:57:17
發現這個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做,看看是否連接表爲空,這樣你可以刪除一個表中的記錄是沒有一個匹配(如準備添加關係。)示例文章即將推出。
由於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引擎引發錯誤。
這比delete-join構造更清潔 – asakura89 2016-01-12 10:22:19
雖然OP不想使用'in'語句,但在答覆Ankur Gupta時,這是我發現刪除一個表中不存在於另一個表中的記錄的最簡單方法,一對多關係:
DELETE
FROM Table1 as t1
WHERE ID_Number NOT IN
(SELECT ID_Number FROM Table2 as t2)
在Access 2016中工作就像一個魅力,對我來說。
我經常做類似下面的組裝例子。 (這個例子來自在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');
我喜歡這種方法,因爲過濾標準 - 至少對我來說 - 更容易在創建查詢閱讀,並從現在開始明白了許多個月的時候,我看着它,不知道是什麼我剛在想。
這將刪除所有行中Table1
符合條件:
DELETE Table1
FROM Table2
WHERE Table1.JoinColumn = Table2.JoinColumn And Table1.SomeStuff = 'SomeStuff'
PostgreSQL的實現將是:
DELETE FROM t1
USING t2
WHERE t1.id = t2.id;
爲什麼你想要做一個加入? – tster 2009-10-19 20:09:24
你打算如何處理這個問題:http://stackoverflow.com/questions/1590709/how-to-mark-counted-rows-as-deleted-contind-from-previous-question – 2009-10-19 20:10:38
因爲連接通常更快。 – HLGEM 2009-10-19 20:10:52