在sql中使用exists来查找重复项,有没有更干净的方法?

Posted

技术标签:

【中文标题】在sql中使用exists来查找重复项,有没有更干净的方法?【英文标题】:Uisng exists in sql to find duplicates, is there a cleaner way? 【发布时间】:2016-07-04 13:32:43 【问题描述】:

请参阅下面的脚本以查找 SQL Server DB 中的重复项。有没有更清洁的方法?

select itemnum 
from matusetrans a
where exists (select null 
              from matusetrans b 
              where a.itemnum = b.itemnum 
                and a.actualdate = b.actualdate 
                and a.matusetransid != b.matusetransid 
                and (a.rotassetnum = b.rotassetnum 
                     or (a.rotassetnum is null and b.rotassetnum is null))    
                and a.quantity = b.quantity)
group by itemnum

【问题讨论】:

请明确定义“重复”。您是指行中所有列都匹配的两条记录吗? 嗨,Mfusiki,是的,在代码中的条件匹配且计数大于 1 处重复。 请参考本帖:***.com/questions/2594829/… 有了这个线程,我无法识别唯一的 itemnum。 按照@Mfusiki 的建议,使用 GroupBy 和 Have 子句 【参考方案1】:

你可以试试:

SELECT itemnum
FROM matusetrans
GROUP BY [ColumnNames]
HAVING 
COUNT(*) > 1

【讨论】:

【参考方案2】:

假设您想在表中查找重复的 itemnum,请使用以下查询

SELECT itemnum
FROM matusetrans
GROUP BY [ItemNum]
HAVING COUNT(ItemNum) > 1

使用HAVING COUNT(*) > 1 可能会给您带来结果,因为如果有任何Datetime 列(如订单日期时间),每个记录通常会有所不同,那么所有结果都是不同的。

谢谢, 斯里

【讨论】:

【参考方案3】:

另一种可能性(但不一定是“更干净”)可能是

WITH cte AS(
  SELECT columns, ROW_NUMBER() OVER (PARTITION BY columns ORDER by columns) AS RowIdx
    FROM matusetrans
    GROUP BY columns
)
SELECT *
  FROM cte
  WHERE RowIdx > 1

【讨论】:

以上是关于在sql中使用exists来查找重复项,有没有更干净的方法?的主要内容,如果未能解决你的问题,请参考以下文章

SQL 查找具有多个字段的重复项(没有唯一 ID)

SQL:使用案例在单独的列中查找重复项和标记

使用 Not exists SQL ORACLE 避免列重复

2022-11-29:查找重复的电子邮箱。以下数据中a@b.com是重复的,请写出sql语句。 DROP TABLE IF EXISTS person; CREATE TABLE person (

sql 在多列中查找重复项

在 SQL 中查找重复的值对