我有两张桌子。 Table 1
有大约80行,Table 2
大约有1000行。
我想使用Table 2
中的随机行更新Table 1
中的所有行。我不希望所有行都有相同的行。是否可以更新Table 2
并让它随机选择要更新的每一行的值?
这是我尝试过的,但它在每一行中都有相同的值。
update member_info_test
set hostessid = (SELECT TOP 1 hostessId FROM hostess_test ORDER BY NEWID())
**被修改
答案 0 :(得分:15)
好吧,我认为这是我写过的最奇怪的查询之一,我认为这将是非常缓慢的。但试一试:
UPDATE A
SET A.hostessid = B.hostessId
FROM member_info_test A
CROSS APPLY (SELECT TOP 1 hostessId
FROM hostess_test
WHERE A.somecolumn = A.somecolumn
ORDER BY NEWID()) B
答案 1 :(得分:1)
我认为这会奏效(至少with
部分会有效):
with toupdate as (
select (select top . . . hostessId from hostess_test where mit.hostessId = mit.hostessId order by newid()) as newval,
mit.*
from member_info_test mit
)
update toupdate
set hostessid = newval;
这个(和Lamak的)的关键是子查询中的外部相关性。这说服优化器实际运行每行的查询。我不知道为什么这会起作用而另一个版本不会。
答案 2 :(得分:0)
以下是我最终使用的内容:
EnvelopeInformation将是您的表2
PaymentAccountDropDown将是您的表1(在我的情况下我有3个项目) - 为您的用例更改3到80.
;WITH cteTable1 AS (
SELECT
ROW_NUMBER() OVER (ORDER BY NEWID()) AS n,
PaymentAccountDropDown_Id
FROM EnvelopeInformation
),
cteTable2 AS (
SELECT
ROW_NUMBER() OVER (ORDER BY NEWID()) AS n,
t21.Id
FROM PaymentAccountDropDown t21
)
UPDATE cteTable1
SET PaymentAccountDropDown_Id = (
SELECT Id
FROM cteTable2
WHERE (cteTable1.n % 3) + 1 = cteTable2.n
)
答案 3 :(得分:0)
Update Table with Random fields
UPDATE p
SET p.City= b.City
FROM Person p
CROSS APPLY (SELECT TOP 1 City
FROM z.CityStateZip
WHERE p.SomeKey = p.SomeKey and -- ... the magic! ↓↓↓
Id = (Select ABS(Checksum(NewID()) % (Select count(*) from z.CityStateZip)))) b