我似乎永远不会记得这个问题!
我想删除table1中ID与表2中相同的所有行。
所以:
DELETE table1 t1
WHERE t1.ID = t2.ID
我知道我可以做一个WHERE ID IN(SELECT ID FROM table2)但是如果可能的话我想用JOIN做这个查询。
答案 0 :(得分:68)
DELETE Table1
FROM Table1
INNER JOIN Table2 ON Table1.ID = Table2.ID
答案 1 :(得分:67)
DELETE t1
FROM Table1 t1
JOIN Table2 t2 ON t1.ID = t2.ID;
我总是在delete语句中使用别名,因为它可以防止意外
DELETE Table1
在运行之前未能突出显示整个查询时导致。
答案 2 :(得分:30)
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)
答案 3 :(得分:12)
PostgreSQL的实现将是:
DELETE FROM t1
USING t2
WHERE t1.id = t2.id;
答案 4 :(得分: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;
答案 5 :(得分:3)
我认为如果你试过这个,你可能会获得更多的表现
DELETE FROM Table1
WHERE EXISTS (
SELECT 1
FROM Table2
WHERE Table1.ID = Table2.ID
)
答案 6 :(得分:3)
这将删除Table1
中符合条件的所有行:
DELETE Table1
FROM Table2
WHERE Table1.JoinColumn = Table2.JoinColumn And Table1.SomeStuff = 'SomeStuff'
答案 7 :(得分: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来删除带连接的记录也可以查看连接表是否为NULL,这样就可以删除一个没有匹配的表中的记录(比如准备中)用于添加关系。)示例帖子。
答案 8 :(得分:2)
由于OP不要求特定的DB,因此最好使用标准的兼容语句。
只有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引擎必须引发错误。
答案 9 :(得分:0)
引用MSDN T-SQL DELETE(示例D):
DELETE FROM Table1
FROM Tabel1 t1
INNER JOIN Table2 t2 on t1.ID = t2.ID
答案 10 :(得分: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;
答案 11 :(得分:0)
我知道这是旧的,但只是一个指向任何人使用这个屁股的指针。我刚试过这个,如果你使用的是Oracle,JOIN在DELETE语句中不起作用。 您收到以下消息:
ORA-00933:SQL命令未正确结束。
答案 12 :(得分:0)
虽然OP不想使用'in'语句,但是在答复Ankur Gupta时,这是我发现删除一个表中不存在于另一个表中的记录的最简单方法,很多关系:
DELETE
FROM Table1 as t1
WHERE ID_Number NOT IN
(SELECT ID_Number FROM Table2 as t2)
对我来说,像Access 2016中的魅力一样。
答案 13 :(得分:0)
我经常做类似下面的例子。 (此示例来自在Linux上运行的Informix SE。)
这个例子的目的是删除所有房地产豁免/减少交易记录 - 因为减排应用程序有一个错误 - 基于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');
我喜欢这种方法,因为过滤标准 - 至少对我来说 - 在创建查询时更容易阅读,并且从现在开始了解很多个月我正在查看它并想知道我是什么思。
答案 14 :(得分:0)
delete
table1
from
t2
where
table1.ID=t2.ID
在mssql上工作