2011-12-02 10 views
1

私は台無しにして、重複した行を持つテーブルを埋める...私はこれのようなテーブルを持っています(実際に何千ものこのような:-() :。SQLテーブル内で等しい2つのカラムを持つローのグループを取得

id gname  pname value 
1  15   13  test 
2  15   13  test 
3  15   13  test 
4  18   18  test 
5  18   18  test 
6  18   18  test 

このテーブルは、同じgnameは、PNAMEと値の1行を許可するようになっている

は、だから今、私は一緒になるグループのすべてのこれらの共通の行をいくつかのSQLを記述する必要があり、 1つを除いてすべて削除してください!Argh!

誰でも助けてもらえますか?ステップ1、私は重複のすべてのグループを返すためのステートメントを得るだけであると信じています。

**私はこれが完全にジャックされていることを知っています。これは私が継承した非常に古いシステムで、これを使用している大きなクライアント...だから私はその問題を認識しています。私はこれを引き起こしたコードを修正することができます。私はDBを元のように戻します。

ありがとうございます! idがユニークで自動インクリメントの場合

答えて

4

は、これは簡単です:

DELETE Table 
WHERE ID NOT IN (SELECT MIN(id) 
        FROM Table 
        GROUP BY gname, pname, value) 

はしかし、最初SELECTを行います。

+0

私もビートします。 –

+0

「まずはセレクトしてください」とはどういう意味ですか? –

+0

@toddv:削除を実行する前に、削除する行を確認してください。意味は –

0

このショットを書いてください。 RANK関数を使用して、各gname/pname/valueタプルの最初のものを除くすべてをプルします。

DELETE a 
FROM _table_ a 
JOIN 
(
    SELECT id 
     , RANK() OVER (PARTITION BY gname, pname, value ORDER BY id ASC) AS r 
    FROM _table_ 
) b 
    ON a.id = b.id 
    AND b.r > 1 
関連する問題