fue*_*sjr 4 sql database platform-agnostic
我有一个具有冗余数据的表,我正在尝试识别所有具有重复子行的行(缺少更好的单词).通过子行我的意思是只考虑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
Run Code Online (Sandbox Code Playgroud)
我需要一个返回此的SQL查询:
COL1 COL2 COL3
---------------------
aa 111 blah_x
aa 111 blah_j
bb 112 blah_d
bb 112 blah_d
Run Code Online (Sandbox Code Playgroud)
这对你有用吗?
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
Run Code Online (Sandbox Code Playgroud)
使用您列出的数据,您的查询无法进行.第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
Run Code Online (Sandbox Code Playgroud)
你最终得到这个答案:
COL1 COL2 COL3
---------------------
aa 111 blah_x
aa 111 blah_j
Run Code Online (Sandbox Code Playgroud)
这是因为第5行和第6行具有相同的COL3值.任何返回第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
Run Code Online (Sandbox Code Playgroud)
[编辑简化WHERE子句]
你会得到你想要的结果:
COL1 COL2 COL3
---------------------
aa 111 blah_x
aa 111 blah_j
bb 112 blah_d
bb 112 blah_d
Run Code Online (Sandbox Code Playgroud)
我刚刚在SQL Server 2000上对此进行了测试,但您应该在任何现代SQL数据库上看到相同的结果.
blorgbeard证明我错了 - 对他有好处!