2017-07-26 21 views
0

重複していないレコードをすべて検索し、列の1つを更新したいとします。列の1つに基づいて複製されていないレコードを検索して更新します。

Ex。

Col_1 | Col_2 | Col_3 | Col_4 | Col_5 
A  | AA | BB | 1  | 
A  | AB | BC | 2  | 
A  | AC | BD | 3  | 
B  | BB | CC | 1  | 
B  | BB | CC | 2  | 
C  | CC | DD | 1  | 

私のクエリはCOL_1によってグループにあり、そして私はCol_5をCol_2とCOL3に基づいていない一意のレコードを検索し、更新します。

基本的には出力は以下のようにする必要があり、

Col_1 | Col_2 | Col_3 | Col_4 | Col_5 
A  | AA | BB | 1  | 1 
A  | AB | BC | 2  | 1 
A  | AC | BD | 3  | 1 
B  | BB | CC | 1  | 0 
B  | BB | CC | 2  | 0 
C  | CC | DD | 1  | 0 

誰がどのように私はこれを達成することができますアイデアを持っていますか?これは大きなデータベースなので、パフォーマンスも重要な要素です。

ヒープヒープ

+0

お試しいただいた質問をお答えください。 – Fmanin

+0

申し訳ありませんが、私はまだ私が欲しいものを書くことができません。ありがとう – Ash

+0

最後の行が更新されないのはなぜですか? – gotqn

答えて

0

これにはさまざまな方法があります。この解決策は、私がアクセス権を持っているポストグルから来ていますが、一般的な構文を持つ必要があるので、tsqlでもうまくいくと思います。

;WITH 
cte_1 AS (
    SELECT col_1 FROM some_table GROUP BY col_1 HAVING count(*) > 1 
), 
cte_2 AS (
    SELECT col_1 FROM some_table GROUP BY col_1, col_2, col_3 HAVING count(*) > 1 
), 
cte_3 AS (
    SELECT cte_1.col_1 FROM cte_1 
    LEFT JOIN cte_2 ON cte_1.col_1 = cte_2.col_1 
    WHERE cte_2.col_1 IS NULL 
) 
UPDATE some_table SET col_5 = 1 
FROM cte_3 WHERE cte_3.col_1 = some_table.col_1; 

だからこそ何が起こりますか?複数col2col_3

  • cte_2を持つことができるの行を抽出

    • cte_1がそれらを選択:

      1. まず、私たちは、私たちは小さな部分にロジックを分割することができます3 CTE半のテーブルを構築しますユニークではないcol_2col_3

      2. cte_3これはを返します私はあなたのテーブルがここにsome_tableと呼ばれていることを前提としていただLEFT JOIN我々は正しく

      some_tableを更新することができます最後cte_3構造を使用して

  • でユニークcol_2col_3を持っ。パフォーマンスについて心配している場合は、ここにプライマリキーを用意してください。col_2col_3(スタンドアロンですが、(col_1, col_2)などでコンポジットになる場合は役立つかもしれません)のインデックスを持つのも良いでしょう。また

    あなたも効率を得るためにインデックスを付けることができ一時的テーブルを(使用するからCTEを、それを移動することができます。

    も、このクエリはあなたの例ではなく、実際のデータなしで正常に動作しますのでご注意くださいそれは?

    ちょうど私はあなたが同じ時間にcol_1 = Aいくつかのユニークかつ非uniqe col_2を持っているだろうというとき、何が起こるかということを意味する。推測かもしれないが、私はそれが起動する良い点だと考えている。

  • +0

    詳細については、ありがとうございます。あなたが言ったように、col_1にはユニークでユニークでないものがあると動作しませんでした。そこで以下のようにCTEを更新しました。 – Ash

    0
    ;WITH 
    cte_1 AS (
        SELECT col_1, count(*) as items FROM some_table GROUP BY col_1 HAVING count(*) > 1 
    ), 
    cte_2 AS (
        SELECT col_1, count(*) as items FROM some_table GROUP BY col_1, col_2, col_3 HAVING count(*) > 1 
    ), 
    cte_3 AS (
        SELECT cte_1.col_1 FROM cte_1 
        LEFT JOIN cte_2 ON cte_1.col_1 = cte_2.col_1 
        WHERE cte_2.col_1 IS NULL OR cte_1.items > cte_2.items 
        GROUP BY cte_1.col_1 
    ) 
    UPDATE some_table SET col_5 = 1 
    FROM cte_3 WHERE cte_3.col_1 = some_table.col_1; 
    
    関連する問題