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 列中的值匹配的主要内容,如果未能解决你的问题,请参考以下文章
pandas索引复合索引dataframe数据索引其中多个水平(level)的多个数据行(index rows from different levels)使用元组tuple表达复合索引的指定行
DB2 SQL Count over Union of multiple tables with different Datatype