从另一个表SQL Server 2014更新随机行

时间:2014-09-19 08:51:46

标签: sql sql-server tsql sql-update

我尝试使用另一个表中的随机行执行UPDATE语句。我知道之前已经问过这个问题(here),但它似乎对我不起作用。

我应该使用与另一个表不同的值更新每一行。在我的情况下,它只从表中获取一个随机行并将其放在每一行中。

UPDATE dbo.TABLE_CHARGE
SET COLRW_STREET = 
     (SELECT TOP 1 COLRW_STREET FROM CHIEF_PreProduction.dbo.TABLE_FAKESTREET
     ORDER BY ABS(CHECKSUM(NewId())%250))

提前致谢!

1 个答案:

答案 0 :(得分:3)

我冒昧地假设您的TABLE_CHARGE表中有ID字段。这可能不是最有效的方式,但似乎有效:

WITH random_values as
(
SELECT t.id, t.COLRW_STREET, t.random_street FROM (
  SELECT c.id, c.COLRW_STREET, 
   f.COLRW_STREET as random_street, ROW_NUMBER() OVER (partition by c.id ORDER BY ABS(CHECKSUM(NewId())%250)) rn
  FROM table_charge c, TABLE_FAKESTREET f) t
  WHERE t.rn = 1
)
UPDATE random_values SET COLRW_STREET = random_street;

SQL Fiddle demo

您的原始代码不起作用,因为当您使用一个TOP行执行... SET x = (SELECT TOP 1 ..)数据库对目标表执行OUTER JOIN时,这意味着一个单行应用于目标表中的所有行。因此,您在所有行中都具有相同的值。

以下查询演示了UPDATE

中发生的情况
SELECT * FROM 
    TABLE_CHARGE tc,
     (SELECT TOP 1 COLRW_STREET as random_street FROM TABLE_FAKESTREET
         ORDER BY ABS(CHECKSUM(NewId())%250)) t

我的解决方案获取目标表中每条记录随机排序的所有虚假记录,并且只选择每个ID的第一个记录。