【问题标题】:SQL update column with random numbers from set list of values使用一组值列表中的随机数的 SQL 更新列
【发布时间】:2017-06-04 16:22:05
【问题描述】:

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

我尝试使用

创建一个临时表 (@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 Server 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'

谢谢。

【问题讨论】:

标签: sql-server random newid


【解决方案1】:

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

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,因为我们没有示例数据。

【讨论】:

  • 感谢 SQLChao。这成功了。我唯一需要添加的是 MyTable 中的一个新列,用于插入来自 cte 的计数器。如果不添加它,我的 SELECT 语句中的列比我的 INSERT 语句中的列多。 @SMM,查看了随机名称生成器,但效果不佳。这对我的技能水平来说更简单一些。
猜你喜欢
  • 2015-10-29
  • 2012-10-09
  • 2020-04-30
  • 1970-01-01
  • 1970-01-01
  • 2021-11-02
  • 1970-01-01
  • 1970-01-01
  • 2015-06-30
相关资源
最近更新 更多