根据另一个表删除表中的所有行

时间:2009-10-19 20:05:33

标签: sql

我似乎永远不会记得这个问题!

我想删除table1中ID与表2中相同的所有行。

所以:

DELETE table1 t1
 WHERE t1.ID = t2.ID

我知道我可以做一个WHERE ID IN(SELECT ID FROM table2)但是如果可能的话我想用JOIN做这个查询。

15 个答案:

答案 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上工作