2

多くの重複値を作成するプログラムで 2 つのバグを見つけました。

  • 「一意のインデックス」の代わりに「インデックス」が作成されました
  • 重複チェックが 4 つのねじれたルーチンの 1 つに統合されていませんでした

そのため、データベースにアクセスしてクリーンアップする必要があります。

ステップ 1 は、すべての重複値のカウントでテーブルを装飾することです (次に、最初の値を見つけてから、すべてを移行することを検討します)。

以下のコードは機能します。数年前に同じテーブルで同様の「選択カウントからの更新」を行ったことを思い出し、半分のコードで実行しました。

これを書く良い方法はありますか?

UPDATE 
    shared_link 
SET 
    is_duplicate_of_count = subquery.is_duplicate_of_count 
FROM
    (
        SELECT 
            count(url) AS is_duplicate_of_count 
            , url
        FROM 
            shared_link
        WHERE
            shared_link.url = url
        GROUP BY 
            url
    ) AS subquery
WHERE 
    shared_link.url = subquery.url
;
4

1 に答える 1

6

サブクエリの無意味な(しかし無害な)WHERE句を除いて、通常、クエリは問題ありません。

UPDATE shared_link 
SET    is_duplicate_of_count = subquery.is_duplicate_of_count 
FROM  (
    SELECT url
         , count(url) AS is_duplicate_of_count 
    FROM   shared_link
--  WHERE  shared_link.url = url
    GROUP  BY url
    ) AS subquery
WHERE shared_link.url = subquery.url;

コメントされた句は次と同じです

WHERE  shared_link.url = shared_link.url

NULLしたがって、値を除外するだけです ( NULL = NULLis ではないためTRUE)。これは、セットアップで意図されておらず、必要もない可能性が最も高いです。


それ以外は、エイリアスと短い名前を使用してコードをさらに短縮することしかできません。

UPDATE shared_link s
SET    ct = u.ct
FROM  (
    SELECT url, count(url) AS ct
    FROM   shared_link
    GROUP  BY 1
    ) AS u
WHERE s.url = u.url;

PostgreSQL 9.1 以降では、集約関数とウィンドウ関数、およびデータ変更 CTEを使用して、 1 つのSQL ステートメントで操作全体(重複の識別、データの統合、重複の削除)を実行できる場合があります。これにより、最初に追加の列が不要になります。 .

于 2012-09-07T18:52:00.903 に答える