MyTable
外部キーフィールドを持つテーブルがありますOtherTableID
。
にはすでに数千行ありMyTable
ます。ここOtherTableID
で、のエントリのランダムな(ただし有効な)値を持つようにランダム化しOtherTable
ます。
カーソルを使用する以外に、1つのきちんとしたクエリでこれを行う方法はありますか?
MyTable
外部キーフィールドを持つテーブルがありますOtherTableID
。
にはすでに数千行ありMyTable
ます。ここOtherTableID
で、のエントリのランダムな(ただし有効な)値を持つようにランダム化しOtherTable
ます。
カーソルを使用する以外に、1つのきちんとしたクエリでこれを行う方法はありますか?
;WITH x AS
(
/* apply a random row number to the other table */
SELECT ID, rn = ROW_NUMBER() OVER (ORDER BY NEWID())
FROM dbo.OtherTable
),
y AS
(
/* apply a sequential row number to the source table */
SELECT ID, OtherTableID, rn = ROW_NUMBER() OVER (ORDER BY ID)
FROM dbo.MyTable
)
/* now perform an update using a join on those row numbers */
UPDATE y SET OtherTableID = x.ID
FROM y INNER JOIN x
ON y.rn = x.rn;
これは、一意である限り、重複を生成するべきではありませんdbo.OtherTable.ID
。また、これはあなたが言ったことに依存します-にもっと多くの行がありますdbo.OtherTable
。
編集5:テスト後、重複を気にしない場合、これは魅力のように機能します。100%ランダム。重複を許可しないように微調整できます。
;WITH X AS
(
SELECT ROW_NUMBER() OVER(ORDER BY IdOtherTable) AS 'Row', IdOtherTable
FROM OtherTable
)
UPDATE MyTable
SET IdOtherTable = (SELECT IdOtherTable
FROM X
WHERE Row = round((SELECT RAND() * (SELECT COUNT(IdOtherTable)
FROM OtherTable)), 0, 1) + 1)