0

ここ数日、特定のフィールドに基づいて重複行を見つける適切な方法を研究してきました。もう少し助けが必要だと思います -

 SELECT * 
    FROM enrollees
    INNER JOIN (SELECT first_name, last_name, address1, city, state, zip, program_instance_id, MIN(id) AS MinId, COUNT(id) AS count FROM enrollees GROUP BY first_name, last_name, address1, city, state, zip, program_instance_id) b
    ON enrollees.first_name = b.first_name
        AND enrollees.last_name = b.last_name 
        AND enrollees.address1 = b.address1
        AND enrollees.city = b.city
        AND enrollees.state = b.state
        AND enrollees.zip = b.zip 
        AND count > 1 
        AND enrollees.program_instance_id = b.program_instance_id 
        AND enrollees.id != MinId;

目標は、重複を取得してアーカイブ テーブル (enrollees_duplicates) に配置し、ライブ テーブル (enrollees) から重複を削除することです。重複する行を見つけて挿入するクエリを 1 つ作成しようとしましたが、次のエラーが発生します。

「列数が行 1 の値数と一致しません」

私が使ってみたクエリは次のとおりです。

INSERT INTO enrollees_duplicates (SELECT * 
    FROM enrollees
    INNER JOIN (SELECT first_name, last_name, address1, city, state, zip, program_instance_id, MIN(id) AS MinId, COUNT(id) AS count FROM enrollees GROUP BY first_name, last_name, address1, city, state, zip, program_instance_id) b
    ON enrollees.first_name = b.first_name
        AND enrollees.last_name = b.last_name 
        AND enrollees.address1 = b.address1
        AND enrollees.city = b.city
        AND enrollees.state = b.state
        AND enrollees.zip = b.zip 
        AND count > 1 
        AND enrollees.program_instance_id = b.program_instance_id 
        AND enrollees.id != MinId);

INNER JOIN 選択ですべての列を取得していないためだと思いますか? その場合、新しいテーブルには存在しない余分な列が 2 つあるため、(MinId と count を追加して) SELECT * に変更しても同じエラーがスローされませんか?

重複を SELECT し、それらを PHP 配列に格納し、別の SQL クエリを使用して各行をプルし、それを重複テーブルに挿入し、次に別のSQLを使用することなく、SQL クエリですべての作業を行う方法はありますか?重複行を削除するクエリ。

私の意図は、2 つのクエリを使用することでした。1 つはすべての重複行をアーカイブ テーブルに挿入し、もう 1 つは重複行を削除します。どういうわけか、重複を見つけてアーカイブテーブルに挿入し、それらを削除する1つのクエリにすることができれば、それはさらに良いでしょう.

この分野は初めてなので、ヘルプやガイダンスをいただければ幸いです。

4

2 に答える 2

0

私の問題の解決策は、最初の選択が「*」だけだったときに、結果に 2 つの列 (MinId、カウント) が追加されたため、列の数が異なっていたことです。「enrollees」テーブルの結果のみを取得し、サブクエリの追加パラメーターも取得しないことで、列の違いが修正されます。

INSERT INTO enrollees_duplicates (SELECT enrollees.* 
    FROM enrollees
    INNER JOIN (SELECT first_name, last_name, address1, city, state, zip, program_instance_id, MIN(id) AS MinId, COUNT(id) AS count FROM enrollees GROUP BY first_name, last_name, address1, city, state, zip, program_instance_id) b
    ON enrollees.first_name = b.first_name
        AND enrollees.last_name = b.last_name 
        AND enrollees.address1 = b.address1
        AND enrollees.city = b.city
        AND enrollees.state = b.state
        AND enrollees.zip = b.zip 
        AND count > 1 
        AND enrollees.program_instance_id = b.program_instance_id 
        AND enrollees.id != MinId);
于 2013-10-19T03:10:44.427 に答える
0

「列数が行 1 の値数と一致しません」

テーブル enrollees_duplicates と enrollees の構造は異なります。

ON DELETE TRIGGER を使用した方が良いでしょうか?( http://dev.mysql.com/doc/refman/5.0/en/create-trigger.html )。

于 2013-10-18T20:40:07.230 に答える