0

2 つのテーブル (id_test, test) があり、それぞれに一意の ID 列があり、2 つのテーブルで同じ ID を持つ 2 つのエントリは同じです。ここで、テーブルの 1 つ (id_test) に別の列があり、これも一意である必要があるため、この別の列に従って重複を排除したいので、YD と呼びましょう。

使用した重複を特定するには

SELECT ID, YD AS x, COUNT(*) AS y
FROM id_test 
GROUP BY x 
HAVING y>1;

ここで、両方のテーブルでこれらのエントリを削除したいと思います。どうすればいいですか?

4

3 に答える 3

1

このクエリは、テーブル内のすべての最初のものを示していますIDYDid_test

SELECT ID, YD
FROM id_test
GROUP BY YD

これらは保持する必要がある行です。次のクエリは、削除する必要がある ID を返します。

SELECT id_test.ID
FROM id_test LEFT JOIN (select ID, YD from id_test group by YD) id_test_keep
     on id_test.ID=id_test_keep.ID and id_test.YD = id_test_keep.YD
WHERE id_test_keep.ID IS NULL

今、私はあなたのテーブルについてもっと詳細が必要だと思いますが、あなたが必要だと思うのはこれです:

DELETE FROM test
WHERE
  test.ID IN (
    SELECT id_test.ID
    FROM id_test LEFT JOIN (select ID, YD from id_test group by YD) id_test_keep
         on id_test.ID=id_test_keep.ID and id_test.YD = id_test_keep.YD
    WHERE id_test_keep.ID IS NULL)
于 2012-11-20T14:22:35.653 に答える
1

ALTER TABLE構文の下に記載されているとおり(強調を追加):

IGNORE標準 SQL に対する MySQL 拡張です。ALTER TABLE新しいテーブルで一意のキーが重複している場合、または厳密モードが有効になっているときに警告が発生した場合の動作を制御します。が指定されていない場合IGNORE、重複キー エラーが発生すると、コピーは中止され、ロールバックされます。が指定されている場合IGNORE、一意のキーが重複している行のうち、最初の行のみが使用されます。他の競合する行は削除されます。正しくない値は、最も一致する許容値に切り捨てられます。

したがって:

ALTER IGNORE TABLE id_test ADD UNIQUE (YD)
于 2012-11-20T13:21:45.330 に答える
0

データが大きい場合は不可能なので、ユーザーは選択しないと思います。同じ構造のテーブルを複製する必要があります。重複しないデータを挿入してください。

INSERT INTO test_new (ID, YD) SELECT t.ID, t.YD FROM test t LEFT JOIN test_id ti ON t.ID = ti.id WHERE ti.id IS NULL;

テーブル テストをドロップした後、名前を test_new -> test に変更します。

于 2016-01-07T09:01:17.007 に答える