开发者

SQL Return only duplicate rows

开发者 https://www.devze.com 2023-01-29 12:48 出处:网络
I have a query that returns the following rows: StateId, OrderId, OrderTime, PermitId I need to return only the rows that are exact duplicates all across the board so each record must be exctly the

I have a query that returns the following rows:

StateId, OrderId, OrderTime, PermitId

I need to return only the rows that are exact duplicates all across the board so each record must be exctly the same as the other record for it to be a duplicate. I would like to ret开发者_如何学Curn both records. These reocrds are mixed in with a bunch of records that do not have duplicates...

Any idea?


First, identify the duplicates. Second, join back to extract these rows.

A non-aggregated (or non-window/ranking) self join forms a partial cross join and gives the square of duplicates for any set of keys. Including non-duplicates too. 1 x 1 = 1 after all.

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


In general, if you're just trying to see what rows have duplicate for those values...

SELECT StateId, OrderId, OrderTime, PermitId, COUNT(*) FROM Foo
GROUP BY StateId, OrderId, OrderTime, PermitId
HAVING COUNT(*) > 1


One possibility if your database server supports subqueries:

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 )
0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号