0

テーブル内のすべての重複を選択する必要がありますが、重複は 2 つの行に分散する必要があります。私はこのコードに私を導くいくつかのものを試しました:

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

ただし、このコードは明らかな理由で機能しません。両方のフィールドで重複を選択するため、クライアント名が 2 行に表示される場合、郵便番号が一致しなくても「重複」と見なされます。

主キー (数値とシーケンス) を追加する単一のサブ選択を実行しようとしましたが、結果は私が望んでいたものではありませんでした。説明はできませんが、テスト データがサンプルから欠落していたため、ソリューションを却下しました。

4

1 に答える 1

2

このようなものがあなたが探していることをするだろうと思います。WHERE IN基本的には、節をJOINより柔軟なに移動するだけです。

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

これにより、フィルター a の結果セットが制限され、ステータスが拒否された行が削除されます

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

フィルターC

これは、ステータスが拒否された同じ組み合わせを持つ行が存在しないクライアント/郵便番号の組み合わせのみを返します。

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