sql >> データベース >  >> RDS >> Database

SQLで重複する行を見つける方法は?

    問題:

    テーブルに重複する行があり、IDのみが一意です。これらの重複するエントリをどのように見つけますか?

    例:

    データベースには、product 次の列にデータがあります:idname 、および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) > 1HAVINGであることを忘れないでください グループをフィルタリングできます。 WHERE 個々の行をフィルタリングするためのものです。


    1. MySQLフィールドの先頭と末尾の空白を削除するにはどうすればよいですか?

    2. IRI WorkbenchでのInformix(IDS12 DB)への接続

    3. SQLiteで月末を返す

    4. MySQLの文字セットと照合を理解する