2017-10-04 7 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 

UPDATED SOLUTION

ソース表に以下の行を持っているので、私はすべての可能性を得るために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は宛先テーブルの行更新数を制限しています。 sourceFieldには多くのソースレコードがあるので、 "WHERE sourceField <>" '"にしておくことが重要です。 – TTT

+0

あなたはそれが "UPDATE dt"ですか? "UPDATE destinationtable"ですか? – TTT

+0

@TTT各テーブルにはいくつのレコードがありますか? – SQLChao

関連する問題