2016-05-12 71 views
0

這很難解釋我的問題,但這是問題所在。我有一張350k記錄表。桌子上充滿了skus和其他零件信息。有許多行具有相同的sku。例如,sku 45666有5行。我需要在每個這些行上放置一個唯一標識符。例如45666〜1,45666〜2,等等。該解決方案,我想出了用在while循環while循環,只是做他們一次一個像這樣如何在具有相同列值的行上附加唯一標識符

$i=0 
while($i -le $array.length) { 
$j=0 
$mfp = $array.itemnumber[$i] 
while($array.itemnumber[$i] = $mfp) { 
    Invoke-SQLCmd -ServerInstance $Server -Database $Database -Query "update whiproducts set number = $j" 
    $i++ 
    $j++ 
} 

}

當我選擇它時,我會在做這個連接數時選擇sku。這裏的問題是這個問題已經運行了30分鐘,這對於我正在進行的這個項目來說並不合適。有沒有一些快速簡單的方法來做到這一點我失蹤了!?

感謝您的幫助!

+0

看起來你正在運行350K不同的查詢,更新每一行。是對的嗎?如果是這樣,那是你的問題。 –

+0

你是對的我。我不知道還有什麼要做! –

回答

3

給這個查詢一個嘗試(請不要測試或備份之前生產數據,運行此):

update t 
set t.sku = t.sku + '~' + cast(t.RowNumber as varchar) 
from (
    select sku, row_number() over(partition by sku order by sku) as RowNumber 
    from whiproducts) t 
+1

這應該工作。而且它似乎正在編輯sku字段,確切地說@Patrick Mahoney要求它被編輯。 +1 – Sturgus

+0

我在最後一個圓括號附近發生錯誤(t.rownumber as varchar)錯誤的語法 –

+0

@PatrickMahoney您正在使用哪種DBMS? – Sturgus

0

如何追加一個唯一的GUID。然後你可以用一個更新語句來做事情,根本不需要循環。

UPDATE whipproducts SET number = number + '_' + cast(NEWID() as varchar(100))

0

如果你把你的數據到本地數據表什麼的,您可以將源查詢更改爲:

SELECT ROW_NUMBER() OVER (ORDER BY sku) AS ID, * 
FROM YourTable; 

然後,你可以假裝「ID」是你的唯一標識當處理數據時,儘管如果你不得不將數據發送回服務器,它並沒有什麼幫助。

真的,表上應該有某種主鍵。如果沒有,你可能需要考慮增加一個,如果你有權限的話(ALTER TABLE)。

相關問題