1

以下のようなテーブルがあります(MS SQL Server 2008を使用)

Contact1    Contact2
--------    ---------
1234567890  9087654321
9087654321  1234567890
1234567890  1234567890
9087654321  9087654321
8989898989  9898989898
9898989898  8989898989

2行目と5行目のContact1とContact2の値は、それぞれ1行目と6行目の値を入れ替えたものです。また、3行目と4行目で両方の値が同じです。

偽のエントリがいくつかあるので、それらを削除する必要があります。結果のテーブルは次のようになります-

Contact1    Contact2
--------    ---------
1234567890  9087654321
8989898989  9898989898

私はSQLの初心者であり、先に進むためのアイデアがありません。どんな助けでも大歓迎です。

4

2 に答える 2

2

MSDNフォーラムから解決策を入手しました

WITH swapped_Contacts AS (
     SELECT
        CASE WHEN Contact1 <= Contact2 THEN Contact1 ELSE Contact2 END AS Contact1
        ,CASE WHEN Contact2 > Contact1 THEN Contact2 ELSE Contact1 END AS Contact2
    FROM dbo.Contacts
)
,ordered_Contacts AS (
    SELECT 
        Contact1
        , Contact2
        , ROW_NUMBER() OVER(PARTITION BY Contact1, Contact2 ORDER BY Contact1, Contact2) AS rownum
    FROM swapped_Contacts
    )
DELETE
FROM ordered_Contacts
WHERE 
rownum > 1


DELETE Contacts
FROM   Contacts C1
WHERE  Contact1 = Contact2
AND   EXISTS (SELECT *
          FROM   Contacts C2
          WHERE  C1.Contact1 IN (C2.Contact1, C2.Contact2) 
            AND  C2.Contact1 <> C2.Contact2)
于 2012-12-02T17:51:00.717 に答える
0

私は次のようにします:

  1. テーブルの名前をcontacts_oldに変更します(を使用sp_rename)
  2. 連絡先テーブルを作成します。
  3. Contact1 = Contact2 のレコードを、contacts_old から contact に挿入します。
  4. contact1 = Contact2 のレコードをcontacts_oldから削除します
  5. 今、私たちは記録を残しています
    1. 連絡先レコードは、スワッピングなしで一意です。そのようなレコードは、条件付きLEFT INNER JOINの同じテーブルでWHERE 句を使用して実行することで識別できます。連絡先に挿入すると、これらのレコードを削除できます。JOINc1.Contact1 = c2.Contact2 AND c1.Contact2 = c2.Contact1c2.Contact1 IS NULL
    2. 連絡先の列が交換され、表示されます。何かを始めることができたので、これについて自分で考えたいと思うかもしれません。
于 2012-12-02T16:05:37.603 に答える