0

我需要选择表中的所有重复项,但是重复项必须分布在两行中。我尝试了一些导致我找到这段代码的东西:

SELECT builder_2, sequence, clientname_2, clientPcode_2, status
  FROM tblClient
 WHERE clientname_2 IN (SELECT clientname_2
                          FROM tblClient
                         GROUP BY clientPcode_2, clientname_2
                        HAVING (COUNT(clientPcode_2) > 1) AND (COUNT(clientname_2) > 1)
                        )
   AND clientPcode_2 IN (SELECT clientPcode_2
                           FROM tblClient
                          GROUP BY clientPcode_2, clientname_2
                         HAVING (COUNT(clientPcode_2) > 1) AND (COUNT(clientname_2) > 1)
                        )
 ORDER BY clientPcode_2, clientname_2

但是,由于显而易见的原因,此代码不起作用,它会选择两个字段中的任何重复项,因此如果客户名称出现在两行中,即使邮政编码不匹配,他也会被视为“重复”。

我尝试在其中添加主键(数字和序列)的单个子选择,但是结果不是我想要的,似乎是因为 group by。我无法解释,但样本中缺少我的测试数据,因此我拒绝了该解决方案。

4

1 回答 1

2

我认为这样的事情会做你正在寻找的东西。它本质上只是将您的WHERE IN条款移动到JOIN更灵活的 a 。

SELECT  T1.builder_2, T1.sequence, T1.clientname_2, T1.clientPcode_2, T1.status
FROM    tblClient T1
        INNER JOIN 
        (   SELECT  clientname_2, clientPcode_2
            FROM    tblClient
            GROUP BY clientname_2, clientPcode_2
            HAVING COUNT(*) > 1
        ) AS T2
            ON T1.clientname_2 = T2.clientname_2
            AND T1.clientPcode_2 = T2.clientPcode_2

编辑

我不确定您要如何过滤它,因此将添加一个示例来展示您可以过滤数据的 3 种方式。

样本数据(仅相关列)

clientname_2    |   clientPcode_2   |   Status
----------------+-------------------+--------------------
ClientA         |   M1 2AA          |   Accepted
ClientA         |   M1 2AA          |   Pending
ClientA         |   M1 2AA          |   Rejected
ClientB         |   M1 2AA          |   Accepted
ClientB         |   M1 2AA          |   Rejected
ClientC         |   M1 2AA          |   Accepted
ClientC         |   M1 2AA          |   Pending



SELECT  T1.builder_2, T1.sequence, T1.clientname_2, T1.clientPcode_2, T1.status
FROM    tblClient T1
        INNER JOIN 
        (   SELECT  clientname_2, clientPcode_2
            FROM    tblClient
            WHERE   Status NOT LIKE '%Rejected%'        -- FILTER A
            GROUP BY clientname_2, clientPcode_2
            HAVING  COUNT(*) > 1
            AND     SUM(IIF(Status LIKE '%Rejected%', 1, 0)) = 0    -- FILTER C
        ) AS T2
            ON T1.clientname_2 = T2.clientname_2
            AND T1.clientPcode_2 = T2.clientPcode_2
WHERE   Status NOT LIKE '%Rejected%'                        -- FILTER B

仅过滤 A

这会将其限制为仅具有 2 行或更多行且状态未被拒绝的客户/邮政编码组合。状态为拒绝的行仍将被退回。

clientname_2    |   clientPcode_2   |   Status
----------------+-------------------+--------------------
ClientA         |   M1 2AA          |   Accepted
ClientA         |   M1 2AA          |   Pending
ClientA         |   M1 2AA          |   Rejected
ClientC         |   M1 2AA          |   Accepted
ClientC         |   M1 2AA          |   Pending

仅过滤器 B

这将找到所有重复的客户/邮政编码组合,并仅返回状态未被拒绝的行:

clientname_2    |   clientPcode_2   |   Status
----------------+-------------------+--------------------
ClientA         |   M1 2AA          |   Accepted
ClientA         |   M1 2AA          |   Pending
ClientB         |   M1 2AA          |   Accepted
ClientC         |   M1 2AA          |   Accepted
ClientC         |   M1 2AA          |   Pending

过滤器 A 和过滤器 B

这将仅限制仅过滤器的结果集以删除状态被拒绝的行

clientname_2    |   clientPcode_2   |   Status
----------------+-------------------+--------------------
ClientA         |   M1 2AA          |   Accepted
ClientA         |   M1 2AA          |   Pending
ClientC         |   M1 2AA          |   Accepted
ClientC         |   M1 2AA          |   Pending

过滤器 C

这将只返回不存在行的客户/邮政编码组合,具有相同的组合,状态为 Rejected:

clientname_2    |   clientPcode_2   |   Status
----------------+-------------------+--------------------
ClientC         |   M1 2AA          |   Accepted
ClientC         |   M1 2AA          |   Pending
于 2012-07-26T14:15:13.647 回答