【问题标题】:Set field to random value from another table将字段设置为另一个表中的随机值
【发布时间】:2016-03-23 17:27:41
【问题描述】:
update table1
set firstname = (select top 1 firstname from table2 order by NEWID())

这只是将所有记录的 table1.firstname 设置为相同的值。我知道可以这样做,但是我在网上看到的所有内容都希望两个表中的行数相同(或者至少 table1 中的行数更多)。我在 table1 中有 200,000 条记录,在 table2 中有 200 条记录。当行数关闭时,如何将 table1.firstname 设置为 table2.firstname 中的随机值?

【问题讨论】:

  • table1 有主键吗?
  • 你的右侧表达式只被评估一次,你需要寻找一种方法来关联它,就像 devarts 的答案

标签: sql-server sql-server-2008


【解决方案1】:
DECLARE @t1 TABLE (a INT)
DECLARE @t2 TABLE (b INT, c INT)

INSERT INTO @t1(a)
VALUES (0), (1), (2), (3), (4), (5)

INSERT INTO @t2(b)
VALUES (0), (1), (2)

UPDATE t2
SET c = t1.a
FROM @t2 t2
CROSS APPLY (
    SELECT TOP(1) t1.a
    FROM @t1 t1
    WHERE t2.b IS NOT NULL -- any calculations for t2 columns
    ORDER BY NEWID()
) t1

SELECT * FROM @t2

输出 -

b           c
----------- -----------
0           5
1           1
2           0

【讨论】:

  • 根据我的测试,您不能只使用任何列作为此过滤器:WHERE t2.b IS NOT NULL,它必须是唯一的
  • @Lamak 我认为他可以使用ROW_NUMBER,以防这样的字段不存在。
  • @GiorgosBetsos 当然,我只是指出一个问题,因此操作人员在运行此查询之前就知道了
  • 这行得通,谢谢。 @Lamak,我确实有一个独特的字段可用于 t2.b。
猜你喜欢
  • 2013-01-25
  • 1970-01-01
  • 2018-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多