【问题标题】:SQL delete row where one value matches that a value in a DIFFERENT columnSQL 删除行,其中一个值与 DIFFERENT 列中的值匹配
【发布时间】:2016-09-12 15:50:05
【问题描述】:

如果特定 x 值与同一表中任何行中的 y 值匹配,我想删除一行。

例如:

| x | y |  
| 4 | 2 |  
| 2 | 6 |  
| 8 | 1 |  
| 3 | 1 |  
| 7 | 8 |  
| 9 | 5 |

会变成:

| x | y |    
| 4 | 2 |  
| 3 | 1 |  
| 7 | 8 |  
| 9 | 5 |

【问题讨论】:

  • 到目前为止,您尝试了什么?您使用的是哪种 SQL?

标签: sql


【解决方案1】:

使用EXISTS

Delete from 
yourtable where exists (select 1 from tab b where b.y =yourtable.x) 

【讨论】:

    【解决方案2】:

    如果您的数据库允许,自联接可能会起作用:

    DELETE FROM foo AS xside
    LEFT JOIN foo AS yside ON xside.y = yside.x
    

    【讨论】:

    • 一些 RDBMS 不喜欢能够导致行被多次删除的连接。在这种情况下,对于 yside,使用 GROUP BY 或 DISTINCT 的子查询可能会有所帮助。
    • 对于 mysql,这是唯一的方法。您不能对正在修改的表进行(子)选择,但连接有效。
    • 对不起,我的意思是LEFT JOIN (subquery) AS yside
    【解决方案3】:
    Delete from tab where x in ( select y from tab)
    

    y 列中计数空值的替代版本。

    Delete from tab t where exists ( select 1 from tab ta where ta.y = t.x)
    

    【讨论】:

    • @Matt - 在我看来,NULL 问题是避免使用IN 的最有力理由。一些 RDBMS 比其他的优化得更好,但是所有的都会咬你,因为他的列表是 NULLable。
    • @Matt 感谢您的观察。编辑了我的答案以包含查询的替代版本
    猜你喜欢
    • 1970-01-01
    • 2014-09-19
    • 1970-01-01
    • 2017-07-08
    • 2013-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多