【发布时间】:2018-07-20 15:16:04
【问题描述】:
我有一个返回以下行的查询:
StateId、OrderId、OrderTime、PermitId
我只需要返回完全重复的行,因此每条记录必须与另一条记录完全相同才能成为重复记录。我想退回这两条记录。这些记录与一堆没有重复的记录混合在一起......
有什么想法吗?
【问题讨论】:
标签: sql
我有一个返回以下行的查询:
StateId、OrderId、OrderTime、PermitId
我只需要返回完全重复的行,因此每条记录必须与另一条记录完全相同才能成为重复记录。我想退回这两条记录。这些记录与一堆没有重复的记录混合在一起......
有什么想法吗?
【问题讨论】:
标签: sql
首先,识别重复项。其次,重新连接以提取这些行。
非聚合(或非窗口/排名)自联接形成部分交叉联接,并给出任何键集的重复平方。也包括非重复项。毕竟 1 x 1 = 1。
SELECT
t2.*
FROM
(
SELECT
StateId, OrderId, OrderTime, PermitId
FROM
myTable
GROUP BY
StateId, OrderId, OrderTime, PermitId
HAVING
COUNT(*) >= 2
) T1
JOIN
mytable T2 ON T1.StateId = T2.StateId AND T1.OrderId = T2.OrderId AND
T1.OrderTime = T2.OrderTime AND T1.PermitId = T2.PermitId
【讨论】:
一般来说,如果您只是想查看哪些行与这些值重复...
SELECT StateId, OrderId, OrderTime, PermitId, COUNT(*) FROM Foo
GROUP BY StateId, OrderId, OrderTime, PermitId
HAVING COUNT(*) > 1
【讨论】:
如果您的数据库服务器支持子查询,则有一种可能性:
select * from your_table
where (StateId, OrderId, OrderTime, PermitId) in
( select StateId, OrderId, OrderTime, PermitId
from your_table
group by StateId, OrderId, OrderTime, PermitId
having count(1) > 1 )
【讨论】: