問題:
テーブルに重複する行があり、IDのみが一意です。これらの重複するエントリをどのように見つけますか?
例:
データベースには、product 次の列にデータがあります:id 、name 、およびcategory 。
| id | 名前 | カテゴリ |
|---|---|---|
| 1 | ステーキ | 肉 |
| 2 | ケーキ | お菓子 |
| 3 | d>ステーキ | 肉 |
| 4 | 豚肉 | 肉 |
| 5 | ケーキ | お菓子 |
| 6 | ケーキ | お菓子 |
製品の重複する名前とカテゴリを見つけましょう。 COUNTを使用して行をグループ化すると、重複を見つけることができます 集計関数、およびHAVINGの指定 行をフィルタリングする句。
解決策:
SELECT name, category, FROM product GROUP BY name, category HAVING COUNT(id) >1;
このクエリは、重複するレコード(同じ製品名とカテゴリを持つレコード)のみを返します:
| name | カテゴリ |
|---|---|
| ステーキ | 肉 |
| ケーキ | お菓子 |
表には、肉カテゴリのステーキとお菓子カテゴリのケーキの2つの重複製品があります。最初の製品は表に2回繰り返され、2番目の製品は3回表示されます。
ディスカッション:
重複する値を選択するには、同じ値の行のグループを作成してから、カウントが1より大きいグループを選択する必要があります。これは、GROUP BYを使用して実現できます。 およびHAVING 条項。
最初のステップは、ID以外のすべての列(この例ではname)に同じ値を持つレコードのグループを作成することです。 およびcategory )。これは、GROUP BYを使用して行います 句。 GROUP BYの後 キーワードには、グループ化に使用する列の名前を入力します。 idは除外します これはテーブルの主キーであるためです。定義上、各行はその列の下に異なる値を持ちます。これを含めると、重複を検出できなくなります!
複数の行を持つグループを見つけたい。このようなグループには、正しい列にグループ化されている限り、定義上重複が含まれている必要があります。これを行うには、HAVINGを使用します 句。指定する条件は、グループ内の要素の数— COUNT(id) -1より大きくする必要があります:COUNT(id) > 1 。 HAVINGであることを忘れないでください グループをフィルタリングできます。 WHERE 個々の行をフィルタリングするためのものです。