【问题标题】:SQL Return only duplicate rowsSQL 只返回重复的行
【发布时间】:2018-07-20 15:16:04
【问题描述】:

我有一个返回以下行的查询:

StateId、OrderId、OrderTime、PermitId

我只需要返回完全重复的行,因此每条记录必须与另一条记录完全相同才能成为重复记录。我想退回这两条记录。这些记录与一堆没有重复的记录混合在一起......

有什么想法吗?

【问题讨论】:

    标签: sql


    【解决方案1】:

    首先,识别重复项。其次,重新连接以提取这些行。

    非聚合(或非窗口/排名)自联接形成部分交叉联接,并给出任何键集的重复平方。也包括非重复项。毕竟 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
    

    【讨论】:

    • 这是一个非常s
    【解决方案2】:

    一般来说,如果您只是想查看哪些行与这些值重复...

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

    【讨论】:

    • OP 明确声明他/她需要结果集上的两个重复行。
    【解决方案3】:

    如果您的数据库服务器支持子查询,则有一种可能性:

    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 )
    

    【讨论】:

    • 这在某些 RDBMS 中会失败,因为 IN 子句有超过 1 列。可以使用 EXISTS 或 INTERSECT
    • OP 没有说明他/她正在使用什么 RDBMS。它肯定会在某些服务器上工作。
    • 呃,什么 rdbms 不支持多列的 IN 子句?
    • @Ronnis:我认为 SQLServer 不支持它。但 PostgreSQL、MySQL 和其他几个可以。
    • 我的立场是正确的。我一直在 mysql 和 oracle 中使用它,但我对 SQL Server 的使用时间较短,我想我从未在那个项目中使用过这种语法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-12
    • 1970-01-01
    • 2019-09-03
    • 1970-01-01
    • 1970-01-01
    • 2016-12-12
    相关资源
    最近更新 更多