我有一个包含冗余数据的表,我正在尝试识别所有具有重复子行的行(缺少更好的单词)。按子行我的意思是仅考虑COL1
和COL2
。
所以让我说我有这样的事情:
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
答案 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