在一列中查找重复条目

72

我正在编写这个查询来查找表1中的重复CTN记录。所以我的想法是,如果CTN_NO出现两次或更多次,我希望它在我的SELECT *语句输出结果中显示在顶部。

我尝试了以下子查询逻辑,但我需要改进。

  SELECT *
         table1 
   WHERE S_IND='Y'
     and CTN_NO = (select CTN_NO 
                     from table1 
                    where S_IND='Y' 
                      and count(CTN_NO) < 2);
order by 2

3
"more than twice or higher" 的意思是指出现次数超过两次或更多次。当然,重复记录是指出现一次以上的记录。 - johnsyweb
2个回答

173

使用:

  SELECT t.ctn_no
    FROM YOUR_TABLE t
GROUP BY t.ctn_no
  HAVING COUNT(t.ctn_no) > 1

这将展示你的表中有哪些ctn_no值是重复的。在WHERE条件中添加规则可以进一步调整重复项:

  SELECT t.ctn_no
    FROM YOUR_TABLE t
   WHERE t.s_ind = 'Y'
GROUP BY t.ctn_no
  HAVING COUNT(t.ctn_no) > 1

如果您想查看与重复记录相关的其他列值,则需要使用自连接:
SELECT x.*
  FROM YOUR_TABLE x
  JOIN (SELECT t.ctn_no
          FROM YOUR_TABLE t
      GROUP BY t.ctn_no
        HAVING COUNT(t.ctn_no) > 1) y ON y.ctn_no = x.ctn_no

5
添加自连接是一个非常有用的补充。 - secretwep
@OMGponies,你能解释一下join的作用吗? - cokedude
没有自连接,您将看到ctn_no列及其计数。使用自连接,您还将看到YOUR_TABLE中的所有其他列。 - Malcolm Crum

4

尝试使用以下查询,它使用了分析函数SUM:

SELECT * FROM
(  
 SELECT SUM(1) OVER(PARTITION BY ctn_no) cnt, A.*
 FROM table1 a 
 WHERE s_ind ='Y'   
)
WHERE cnt > 2

我不确定为什么如果ctn_no重复超过2次,您会将记录标识为重复记录。对我来说,只要重复一次就是重复的。在这种情况下,请将查询的最后一部分更改为WHERE cnt > 1


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接