2017-10-04 78 views
1

結合一些例子,我想出了以下查詢(字段和表名已匿名,所以我希望我沒有插入錯別字)。用另一個表中的隨機數據更新多行?

UPDATE destinationTable 
SET destinationField = t2.value 
FROM destinationTable t1 
CROSS APPLY (
    SELECT TOP 1 'SomeRequiredPrefix ' + sourceField as value 
    FROM #sourceTable 
    WHERE sourceField <> '' 
    ORDER BY NEWID() 
    ) t2 

問題 目前,所有記錄得到相同價值爲destinationField,值必須是隨機的,不同的。我可能在這裏錯過了一些東西。

回答

1

這是一個可能的解決方案。使用CTE根據隨機順序將行號分配給兩個表。使用該rownumber將表連接在一起,並相應地更新行。

;WITH 
dt AS 
(SELECT *, ROW_NUMBER() OVER (ORDER BY NEWID()) AS RowNum 
FROM dbo.destinationtable), 
st AS 
(SELECT *, ROW_NUMBER() OVER (ORDER BY NEWID()) AS RowNum 
FROM dbo.#sourcetable) 

UPDATE dt 
SET dt.destinationfield = 'SomeRequiredPrefix ' + st.sourcefield 
FROM dt 
JOIN st ON dt.RowNum = st.RowNum 

更新的解決方案

我以前CROSS JOIN讓所有的可能性,因爲你必須在源表中的行數更少。然後分配隨機的rownumbers,每個目的地字段只需要1行。

;WITH cte 
AS 
(
    SELECT *, ROW_NUMBER() OVER (PARTITION BY destinationfield ORDER BY NEWID()) AS Rownum 
    FROM destinationtable 
    CROSS JOIN #sourcetable 
    WHERE sourcefield <> '' 

) 

UPDATE cte 
SET cte.destinationfield = 'SomeRequiredPrefix ' + sourcefield 
WHERE cte.Rownum = 1 

SELECT * FROM dbo.destinationtable 
+0

這是更好的工作,但還沒有做它應該做的一切。數據是隨機的,但#sourcetable儘可能少記錄目標表,因此我正在考慮使用LEFT OUTER JOIN,否則#sourceTable會限制目標表中的行更新次數。仍然保持「WHERE sourceField <>''」是很重要的,因爲很多源記錄在sourceField中都有''。 – TTT

+0

你確定它是「UPDATE dt」嗎? 「不更新目的地表」? – TTT

+0

@TTT每個表中有多少條記錄? – SQLChao

相關問題