SQL 使用一组值列表中的随机数更新列

SQL update column with random numbers from set list of values

我有一个 table 每晚都会被重写。我有两列需要用一组值列表中的随机数填充。角度列需要填充 15、30、45、60、90,距离需要填充 9、15、21。插入语句最多可处理 700 条记录。

我尝试用

创建一个临时文件 table (@MyRandomVal1)
select 15 union 
select 30 union 
select 45 etc...

然后使用(select top 1 val from @MyRandomVal1 order by newid())。这会为所有行使用相同的随机数填充该列。似乎我可能需要遍历插入的行,以便它为每一行运行 (select top 1 val from @MyRandomVal1 order by newid()),但是在我的研究中,我读到不推荐循环。是否有另一种方法可以在插入期间使用集合列表中的随机抽样来填充 700 多行?

下面是我现有的代码(仅用于角度)。 SQL 服务器 2012。

DECLARE @MyRandomVal1 Table (
        id int identity (1,1),
        val int not null)

INSERT INTO @MyRandomVal1 (val)
    SELECT 15
    union
    SELECT 30
    union
    SELECT 45
    union
    SELECT 60
    union
    SELECT 90

INSERT INTO MyTable (AUTO_KEY,E3_KEY,EMPID,ENAME,COLOR,ANGLE)
    SELECT dbo.getautokey(),dbo.GetAutoKey(),[EMPID],[ENAME],abs(checksum(NewId()) % 256),(select top 1 val from @MyRandomVal1 order by newid())
    FROM MyTable2 WHERE [JOBLEVEL]='SVP'

谢谢。

一种方法是使用 cte。加入你的 @MyRandomVal1 到 MyTable2 为真。添加由 newid() 排序的行号。然后获取所有行号 1。您需要检查 PARTITION BY 中的逻辑。我不知道是否有一个专栏是独一无二的。如果不是,您可能必须按所有列进行分区,因为我们将每一行连接到随机值 table.

中的每一行
DECLARE @MyRandomVal1 Table (
        id int identity (1,1),
        val int not null)

INSERT INTO @MyRandomVal1 (val)
    SELECT 15
    union
    SELECT 30
    union
    SELECT 45
    union
    SELECT 60
    union
    SELECT 90

;WITH cte AS (
SELECT 
    dbo.getautokey() AS AUTO_KEY
  , dbo.GetAutoKey() AS E3_KEY
  , [EMPID]
  , [ENAME]
  , ABS(checksum(NewId()) % 256) AS COLOR 
  , a.val
  , ROW_NUMBER() OVER (PARTITION BY empid ORDER BY NEWID()) AS rn
FROM MyTable2
JOIN  @MyRandomVal1 a ON 1 = 1
WHERE [JOBLEVEL]='SVP')

INSERT INTO MyTable (AUTO_KEY, E3_KEY, EMPID,ENAME, COLOR, ANGLE)
    SELECT * FROM cte
    WHERE rn = 1

这是一个简单的 DEMO,因为我们没有示例数据。