これらの行に主キーまたは一意の識別子列がある場合に、MariaDBのテーブルから重複する行を削除する例を次に示します。
例では、重複する行を削除しますが、1つは保持します。したがって、2つの同一の行の場合、一方を削除し、もう一方を保持します。
サンプルデータ
この例では、次のデータを使用しています。
SELECT * FROM Dogs;
結果:
+-------+-----------+----------+ | DogId | FirstName | LastName | +-------+-----------+----------+ | 1 | Bark | Smith | | 2 | Bark | Smith | | 3 | Woof | Jones | | 4 | Ruff | Robinson | | 5 | Wag | Johnson | | 6 | Wag | Johnson | | 7 | Wag | Johnson | +-------+-----------+----------+
最初の2行と、最後の3行が重複していることがわかります。
DogId
列は一意の値を保持するため(テーブルの主キーであるため)、厳密に言えば、重複はありません。しかし、実際の状況では、主キーを含むテーブルの重複を排除したい場合がよくあります。したがって、この記事では主キーを無視し、残りの列で重複する値を検出します。
オプション1
削除するすべての行を選択して、最初のオプションを開始しましょう:
SELECT * FROM Dogs
WHERE DogId IN (
SELECT DogId FROM Dogs
EXCEPT SELECT MIN(DogId) FROM Dogs
GROUP BY FirstName, LastName
);
結果:
+-------+-----------+----------+ | DogId | FirstName | LastName | +-------+-----------+----------+ | 2 | Bark | Smith | | 6 | Wag | Johnson | | 7 | Wag | Johnson | +-------+-----------+----------+
これらの重複する行を削除するには、SELECT *
を切り替えることができます DELETE
へ :
DELETE FROM Dogs
WHERE DogId IN (
SELECT DogId FROM Dogs
EXCEPT SELECT MIN(DogId) FROM Dogs
GROUP BY FirstName, LastName
);
結果:
Query OK, 3 rows affected (0.017 sec)
結果を確認するために、テーブル内の残りのすべての行を選択できます。
SELECT * FROM Dogs;
結果:
+-------+-----------+----------+ | DogId | FirstName | LastName | +-------+-----------+----------+ | 1 | Bark | Smith | | 3 | Woof | Jones | | 4 | Ruff | Robinson | | 5 | Wag | Johnson | +-------+-----------+----------+
代わりに、MAX()
を使用することもできます MIN()
の代わりに関数 削除する行を変更する関数。
オプション2
この例では、テーブルが元の状態に(重複して)復元されていると想定します。
次のクエリを使用して、重複する行をチェックできます。
SELECT *
FROM Dogs d1, Dogs d2
WHERE d1.FirstName = d2.FirstName
AND d1.LastName = d2.LastName
AND d1.DogId <> d2.DogId
AND d1.DogId = (
SELECT MAX(DogId)
FROM Dogs d3
WHERE d3.FirstName = d1.FirstName
AND d3.LastName = d1.LastName
);
結果:
+-------+-----------+----------+-------+-----------+----------+ | DogId | FirstName | LastName | DogId | FirstName | LastName | +-------+-----------+----------+-------+-----------+----------+ | 2 | Bark | Smith | 1 | Bark | Smith | | 7 | Wag | Johnson | 5 | Wag | Johnson | | 7 | Wag | Johnson | 6 | Wag | Johnson | +-------+-----------+----------+-------+-----------+----------+
そして、そのクエリを変更して重複を削除できます:
DELETE FROM Dogs WHERE DogId IN (
SELECT d2.DogId
FROM Dogs d1, Dogs d2
WHERE d1.FirstName = d2.FirstName
AND d1.LastName = d2.LastName
AND d1.DogId <> d2.DogId
AND d1.DogId=(
SELECT MIN(DogId)
FROM Dogs d3
WHERE d3.FirstName = d1.FirstName
AND d3.LastName = d1.LastName
)
);
結果:
Query OK, 3 rows affected (0.075 sec)
これで、テーブルの重複が解除されました。
これは、すべての行を再度選択することで確認できます:
SELECT * FROM Dogs;
結果:
+-------+-----------+----------+ | DogId | FirstName | LastName | +-------+-----------+----------+ | 1 | Bark | Smith | | 3 | Woof | Jones | | 4 | Ruff | Robinson | | 5 | Wag | Johnson | +-------+-----------+----------+
MAX()
を使用できます MIN()
の代わりに 必要に応じて、重複から他の行を削除します。