【问题标题】:How to delete records in one table based on the values in another table?如何根据另一张表中的值删除一张表中的记录?
【发布时间】:2012-01-07 16:12:21
【问题描述】:

这里有两张表:

表1

cm_id   cost
1       6.52
2       16.52
3       2.12
4       7.14
5       19.09
6       11.52
7       0.12

表2

um_id   order_num   name
1       517         tommy
2       518         bobby
3       519         scotty
4       520         faris
5       521         justine
6       522         sadie
7       523         nicole

cm_id 和 um_id 代表同一个东西,因此成本可以与每个订单号绑定,即

SELECT table1.cm_id, table1.cost, table2.order_num, table2.order_num
FROM table1, table2
WHERE table1.cm_id=table2.um_id;

我可以使用哪条 SQL 语句从 table1 中删除 table2 中 order_num 介于 518 和 520 之间的行?

【问题讨论】:

标签: mysql sql


【解决方案1】:

由于IN 有一些性能限制,我们可以使用删除命令和简单的连接查询,例如

delete x from table1 x,table2 y where x.cm_id=y.um_id;

【讨论】:

    【解决方案2】:

    将 DELETE 与子查询一起使用:

    DELETE FROM table1 WHERE table1.cm_id IN (SELECT table2.um_id FROM table2 WHERE order_num>=518 and order_num<=520)
    

    【讨论】:

    • DELETE FROM not DELETE * FROM
    【解决方案3】:

    我更喜欢这种方式

    delete from table1
    using table1, table2
    where table1.cm_id = table2.um_id
    and table2.order_num >= 518
    and table2.order_num <= 520;
    

    【讨论】:

      【解决方案4】:
      DELETE table1
      FROM   table1 INNER JOIN table2 ON table1.cm_id = table2.um_id
      AND    (table2.order_num BETWEEN 518 AND 520)
      
      --OR
      
      DELETE 
      FROM  table1
      USING table1 INNER JOIN table2 ON table1.cm_id = table2.um_id
      WHERE   (table2.order_num BETWEEN 518 AND 520)
      

      编辑:

      有一个重复的FROM,并且查询已根据Andriy M cmets 进行了更改。

      【讨论】:

      • 这适用于 SQL Server。 In MySQL 您应该 a) 删除第一个 FROMb) 将第二个 FROM 替换为 USING
      • 另外,这两个查询有何不同? (我的意思是,除了第二个包含的空格更少。)
      • 哦,我实际上忘记将 WHERE 子句放在第二个查询中,我正在相应地更改,谢谢
      • 澄清一下:当我说,'remove FROM... replace FROM...',我的意思是关键字本身,而不是整个 子句。好吧,您可以在链接的文章中看到正确的语法。
      • 哦,我明白了,我应该再编辑一次吗?感谢您的宝贵时间。
      【解决方案5】:
      delete 
      from table1
      where cm_id IN (select um_id from table2 where order_num between 518 and 520)
      

      【讨论】:

      • 为什么不呢?什么是有效的?还有其他方法吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-22
      • 1970-01-01
      相关资源
      最近更新 更多