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

大きなテーブルで完全に重複する行を確認します

    何かかどうかを確認するには 完全な重複が存在します(すべての列で同一)。これがおそらく最速の方法です:

    SELECT EXISTS (
        SELECT 1
        FROM   tbl t
        NATURAL JOIN tbl t1 
        WHERE  t.ctid <> t1.ctid
        )
    

    NATURAL JOIN を引用すると、このケースの非常に便利な省略形になります。こちらのマニュアル ):

    EXISTS 最初の重複が見つかるとすぐにPostgresが検索を停止するため、おそらく最速です。ほとんどの場合、行全体をカバーするインデックスがなく、テーブルが巨大であるため、これにより大幅に節約できます。 時間の。

    NULLに注意してください 決して 別のNULLと同一と見なされます 。 NULLがある場合 値を同じと見なすと、さらに多くのことを行う必要があります。

    ctid システム列です アドホック主キーとして(ab-)使用できますが、長期的には実際のユーザー定義の主キーを置き換えることはできません。

    古いバージョン8.1には<>がないようです ctidに対して定義された演算子 。 textにキャストしてみてください :

    SELECT EXISTS (
        SELECT 1
        FROM   tbl t
        NATURAL JOIN tbl t1 
        WHERE  t.ctid::text <> t1.ctid::text
        )
    


    1. SQL Server 2005を使用して、カンマ区切りの値を個別の行に展開するにはどうすればよいですか?

    2. MYSQLで文字列の一部を削除する

    3. computer-database-jpaPlay2.1サンプルアプリケーションをMySQLに接続します

    4. mysqlでTCP/IPを介してUnixソケットを使用する正当な理由はありますか?