我有一个表MyTable
,它有一个外键字段OtherTableID
。
MyTable
我已经有几千行了。现在我想随机化OtherTableID
,使其在OtherTable
中具有一些随机(但有效)的条目值。
任何想法如何在一个简洁的查询中执行此操作,而不是使用游标?
答案 0 :(得分:9)
;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
中有更多行。
答案 1 :(得分:0)
编辑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)