2017-08-03 19 views
3

新しい列を持つ表があり、新しい列に入る値を更新しています。簡単にするために、私は私のテーブル構造と私のクエリを減らしています。以下は、私の出力を見たいと思う方法です。フィールドが同じ値で更新されています

IDNumber NewColumn 
    1   1 
    2   1 
    3   1 
    4   2 
    5   2 

WITH CTE_Split 
AS 
(
    select 
    *,ntile(2) over (order by newid()) as Split 
    from TableA 
) 
Update a 
set NewColumn = a.Split 
from CTE_Split a 

今、私はこれを行うとき、私は私のテーブルを取得し、私は私が望む出力を得ることを見ることができる選択を行う際に、このような

 IDNumber NewColumn 
     1   1 
     2   1 
     3   1 
     4   1 
     5   1 

は、しかし、今、私はこれを行っているように見えます結果セットを複数のグループに分割する前に、すべてがselect内で機能しますが、今はテーブルを更新する必要があります。私はこの奇妙な結果を得ています。私が間違っていることを誰かが何らかのフィードバックを提供できるかどうかを静かではない。

私は一日の不満の後、私はこのコードとテーブルを私がすでにこのプロセスを行っていた別のものと比較することができました。このテーブルがすべて1に更新された理由は、テーブルを作った人は誰でもこれがビットフラッグであると思ったからだ。実際にはint型でなければなりません。なぜなら、この場合は実際には2つの可能な値だけですが、それ以外の場合は2つ以上になる可能性があるからです。 ご協力いただきありがとうございます.Ntile関数を使用する際に、テーブルのデータ型を範囲指定するように教えてください。

+3

'order by newid()'を 'order by idnumber'に置き換えるとどうなりますか? –

+0

@ ZeRaTuL_jFあなたのコードを実行しようとしましたが、いくつかの結果ではあなたの結果は同じでした。私はこのキーのランダム化が原因で奇妙な組み合わせが作成されると思います。コードの意図は?たぶん、ロジックは他のものかもしれません。 –

+0

あなたはいつも同じ行動をしますか? –

答えて

1

CTEを更新するのではなく、テーブルを直接更新してみてください。これは、あなたのUPDATEステートメントが何をするかを明確にします。ここで

は一例です。

WITH CTE_Split AS 
(
    SELECT 
     *, 
     ntile(2) over (order by newid()) as Split 
    FROM TableA 
) 
UPDATE a 
SET NewColumn = c.Split 
FROM 
    TableA a 
    INNER JOIN CTE_Split c ON a.IDNumber = c.IDNumber 

私は何を達成したいことは2つの無作為化パーティションにグループにあなたの記録であることを前提としています。この声明は仕事をしているようです。

+0

++ RasmusDybkjær非常にエレガントです。 –

+0

元のテーブルに正しく戻ってこないCTEの問題だと思って以来、私は初めてこれを試しましたが、同じ結果が得られましたが、なぜ私のケースでこれが起こったのかを知ることができました私の編集。 –

+0

ああ - それは意味がある、アップデートのおかげで! – dybzon

関連する問題