SQL 删除行,其中一个值与 DIFFERENT 列中的值匹配

Posted

技术标签:

【中文标题】SQL 删除行,其中一个值与 DIFFERENT 列中的值匹配【英文标题】:SQL delete row where one value matches that a value in a DIFFERENT column 【发布时间】: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? 【参考方案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)

【讨论】:

***.com/questions/32175497/… @Matt - 在我看来,NULL 问题是避免使用IN 的最有力理由。一些 RDBMS 比其他的优化得更好,但是所有的都会咬你,因为他的列表是 NULLable。 @Matt 感谢您的观察。编辑了我的答案以包含查询的替代版本

以上是关于SQL 删除行,其中一个值与 DIFFERENT 列中的值匹配的主要内容,如果未能解决你的问题,请参考以下文章

如果值与在 r 中有条件删除的值匹配,则删除行

pandas索引复合索引dataframe数据索引其中多个水平(level)的多个数据行(index rows from different levels)使用元组tuple表达复合索引的指定行

将 SQL 表中的值与文本框中的条目进行比较

DB2 SQL Count over Union of multiple tables with different Datatype

返回查询的所有行,其中一列中的字符串值与另一列中的字符串值匹配

SQL WHERE 子句将值与尾随空格匹配