我有一个表MyTable
,其中有一个外键字段OtherTableID
。
我已经有几千行了MyTable
。现在我想随机化OtherTableID
,以便它具有一些随机(但有效)的条目值OtherTable
。
任何想法如何在一个简洁的查询中做到这一点,没有使用游标?
我有一个表MyTable
,其中有一个外键字段OtherTableID
。
我已经有几千行了MyTable
。现在我想随机化OtherTableID
,以便它具有一些随机(但有效)的条目值OtherTable
。
任何想法如何在一个简洁的查询中做到这一点,没有使用游标?
;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)