2014-09-19 49 views
2

我嘗試使用另一個表中的隨機行執行UPDATE語句。我知道這個問題之前已經被問到過(here),但它似乎並不適合我。從另一個表更新隨機行SQL Server 2014

我應該用另一個表中的不同值更新每一行。在我的情況下,它只從表中獲得一個隨機行並將其放在每一行中。

UPDATE dbo.TABLE_CHARGE 
SET COLRW_STREET = 
    (SELECT TOP 1 COLRW_STREET FROM CHIEF_PreProduction.dbo.TABLE_FAKESTREET 
    ORDER BY ABS(CHECKSUM(NewId())%250)) 

在此先感謝!

+1

究竟哪些方法不起作用? – Bulat 2014-09-19 09:00:07

+0

感謝您的回覆! 我編輯了我的問題。不工作的部分是它更新隨機值的部分。它確實需要一個隨機值,但只有一個值。之後,將隨機值插入每個地方。 一個帶有大概相同問題的URL:http://goo.gl/pyHuhG – user3208216 2014-09-19 09:14:19

+0

與您提供的鏈接的區別在於從另一個表進行更新,並且在SQL Server 2008和SQLServer 2012中正常工作http://sqlfiddle.com/ #!3/ab537/1 – bummi 2014-09-19 10:06:52

回答

3

我冒昧地假設你在你的TABLE_CHARGE表中有ID字段。這可能不是最有效的方式,但似乎工作:

WITH random_values as 
(
SELECT t.id, t.COLRW_STREET, t.random_street FROM (
    SELECT c.id, c.COLRW_STREET, 
    f.COLRW_STREET as random_street, ROW_NUMBER() OVER (partition by c.id ORDER BY ABS(CHECKSUM(NewId())%250)) rn 
    FROM table_charge c, TABLE_FAKESTREET f) t 
    WHERE t.rn = 1 
) 
UPDATE random_values SET COLRW_STREET = random_street; 

SQL Fiddle demo

您的原始代碼不起作用,因爲當喲做... SET x = (SELECT TOP 1 ..)數據庫做你的目標表的OUTER JOIN一個頂行,這意味着一個單行將應用於目標表中的所有行。因此你在所有行中都有相同的值。

以下查詢說明什麼是在UPDATE發生的事情:

SELECT * FROM 
    TABLE_CHARGE tc, 
    (SELECT TOP 1 COLRW_STREET as random_street FROM TABLE_FAKESTREET 
     ORDER BY ABS(CHECKSUM(NewId())%250)) t 

我的解決方案獲得對目標表中的每個記錄隨機排序都是假的記錄,並只選擇每個ID的第一個。

+0

我不知道這是幹什麼的,說實話。我對CTE不太瞭解。它工作確實,所以謝謝! – user3208216 2014-09-19 10:32:39

+0

我已經更新了我的答案,希望能幫助理解我的解決方案 – Bulat 2014-09-19 10:56:09

+0

謝謝!我現在明白了很多:) – user3208216 2014-09-19 11:00:15

相關問題