問題:
テーブルに重複する行があり、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
個々の行をフィルタリングするためのものです。