12

我有两张桌子。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())

**已编辑

4

4 回答 4

16

好的,我认为这是我写过的最奇怪的查询之一,而且我认为这会非常缓慢。但是试一试:

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
于 2012-10-25T20:53:00.747 回答
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 的)的关键是子查询中的外部相关性。这说服优化器实际运行每一行的查询。我不知道为什么这会起作用而其他版本不会。

于 2012-10-25T21:10:55.547 回答
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
)

参考: http ://social.technet.microsoft.com/Forums/sqlserver/pt-BR/f58c3bf8-e6b7-4cf5-9466-7027164afdc0/updating-multiple-rows-with-random-values-from-another-table

于 2013-09-23T20:25:13.740 回答
0

使用随机字段更新表

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
于 2015-05-27T16:45:55.853 回答