2017-08-03 22 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 

然而,當我做的選擇只有我能看到我得到的慾望輸出,現在我已經做到了這一點之前將結果集分成多個組,一切工作在選擇,但現在我需要更新表我得到這個奇怪的結果。不確定我做錯了什麼,或者是否有人可以提供任何形式的反饋。

那麼沮喪了一整天后,我才得以此代碼,並表的數據進行比較,我已經做了這個過程。這張桌子被更新爲全1的原因是因爲誰發表了這張桌子就認爲這應該是一個標誌。當它成爲現實時,它應該是一個整數,因爲在這種情況下,它實際上只有兩個可能的值,但在其他情況下它可能超過兩個。 非常感謝您提供的所有建議和幫助,它應該教會我在使用ntile函數時可以確定表格的數據類型。

+3

如果更換'通過newid的順序()'與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 

我假設你想要達到的目標是將你的記錄分成兩個隨機分區。這個聲明似乎是爲了完成這項工作。

+0

++ RasmusDybkjær非常優雅。 –

+0

我第一次嘗試這是因爲我認爲這將是CTE不能正確迴流到原始表格的問題,但它也產生了相同的結果,但是我能夠找到爲什麼這發生在我的情況中我的編輯。 –

+0

啊哈 - 這是有道理的,謝謝你的更新! – dybzon