什么是SQL查询列出所有具有2列子行作为重复项的行?

时间:2008-09-25 01:33:57

标签: sql database platform-agnostic

我有一个包含冗余数据的表,我正在尝试识别所有具有重复子行的行(缺少更好的单词)。按子行我的意思是仅考虑COL1COL2

所以让我说我有这样的事情:

 COL1   COL2   COL3
 ---------------------
 aa     111    blah_x
 aa     111    blah_j
 aa     112    blah_m
 ab     111    blah_s
 bb     112    blah_d
 bb     112    blah_d
 cc     112    blah_w
 cc     113    blah_p

我需要一个返回此命令的SQL查询:

 COL1   COL2   COL3
 ---------------------
 aa     111    blah_x
 aa     111    blah_j
 bb     112    blah_d
 bb     112    blah_d

10 个答案:

答案 0 :(得分:8)

这对你有用吗?

select t.* from table t
left join ( select col1, col2, count(*) as count from table group by col1, col2 ) c on t.col1=c.col1 and t.col2=c.col2
where c.count > 1

答案 1 :(得分:5)

根据您列出的数据,您的查询无法进行。第5行和第5行的数据6本身并不明显。

假设您的表名为'quux',如果您从这样开始:

SELECT a.COL1, a.COL2, a.COL3 
FROM quux a, quux b
WHERE a.COL1 = b.COL1 AND a.COL2 = b.COL2 AND a.COL3 <> b.COL3
ORDER BY a.COL1, a.COL2

你最终会得到这个答案:

 COL1   COL2   COL3
 ---------------------
 aa     111    blah_x
 aa     111    blah_j

这是因为第5行和第5行6具有相同的COL3值。任何返回第5行和第5行的查询6还将返回此数据集中所有行的副本。

另一方面,如果您有主键(ID),则可以改为使用此查询:

SELECT a.COL1, a.COL2, a.COL3
FROM quux a, quux b
WHERE a.COL1 = b.COL1 AND a.COL2 = b.COL2 AND a.ID <> b.ID
ORDER BY a.COL1, a.COL2

[编辑简化WHERE子句]

你会得到你想要的结果:

COL1   COL2   COL3
---------------------
aa     111    blah_x
aa     111    blah_j
bb     112    blah_d
bb     112    blah_d

我刚刚在SQL Server 2000上对此进行了测试,但您应该会在任何现代SQL数据库上看到相同的结果。

blorgbeard证明了我wrong - 对他有好处!

答案 2 :(得分:4)

像这样加入你自己:

SELECT a.col3, b.col3, a.col1, a.col2 
FROM tablename a, tablename b
WHERE a.col1 = b.col1 AND a.col2 = b.col2 AND a.col3 != b.col3

如果您正在使用postgresql,则可以使用oid使其返回较少的重复结果,如下所示:

SELECT a.col3, b.col3, a.col1, a.col2 
FROM tablename a, tablename b
WHERE a.col1 = b.col1 AND a.col2 = b.col2 AND a.col3 != b.col3
  AND a.oid < b.oid

答案 3 :(得分:2)

没有数据库方便测试这个,但我认为它应该有用......

select
  *
from
  theTable
where
  col1 in
    (
    select
      col1
    from
      theTable
    group by
      col1||col2
    having
      count(col1||col2) > 1
    )

答案 4 :(得分:2)

我天真的尝试将是

select a.*, b.* from table a, table b where a.col1 = b.col1 and a.col2 = b.col2 and a.col3 != b.col3;

但是会返回所有行两次。我不确定你是如何限制它只返回一次。也许如果有主键,你可以添加“和a.pkey&lt; b.pkey”。

就像我说的那样,这并不优雅,可能有更好的方法来做到这一点。

答案 5 :(得分:2)

这样的事情应该有效:

SELECT a.COL1, a.COL2, a.COL3
FROM YourTable a
JOIN YourTable b ON b.COL1 = a.COL1 AND b.COL2 = a.COL2 AND b.COL3 <> a.COL3

通常,JOIN子句应包括您考虑成为“重复”(本例中为COL1和COL2)的一部分的每一列,以及至少一列(或尽可能多的一列)以消除加入自身的行(在这种情况下为COL3)。

答案 6 :(得分:2)

这与自联接非常相似,只是它没有重复项。

select COL1,COL2,COL3
from theTable a
where exists (select 'x'
              from theTable b
              where a.col1=b.col1
              and   a.col2=b.col2
              and   a.col3<>b.col3)
order by col1,col2,col3

答案 7 :(得分:1)

以下是您查找重复项的方法。使用您的数据在oracle 10g中测试。

从tst中选择* 其中(col1,col2)in (从col1选择col1,col2,col2,col2,计数(*)&gt; 1)

答案 8 :(得分:0)

选择COL1,COL2,COL3

来自表格

按COL1,COL2,COL3分组

有计数(*)&gt; 1

答案 9 :(得分:0)

忘记连接 - 使用分析函数:

select col1, col2, col3
from
(
select col1, col2, col3, count(*) over (partition by col1, col2) rows_per_col1_col2
from table
)
where rows_per_col1_col2 > 1