sql-更新值列表中的行

ia2d9nvy  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(323)

所以表格设置是:

Column1     Column2     Column3
A           1           Null
B           2           Null
C           1           Null
D           2           Null
E           1           Null
F           2           Null
G           1           Null
H           2           Null

我想用一个值数组(value1、value2、value3)更新column3,并在该列表中循环,直到更新完成
最终的目标是让table看起来像这样:

Column1     Column2     Column3
A           1           Value1
B           2           Value2
C           1           Value3
D           2           Value1
E           1           Value2
F           2           Value3
G           1           Value1
H           2           Value2

我最初在powershell中尝试过,但由于数据的导入方式,它并没有像我所希望的那样工作,所以现在我正在研究sql。任何建议都太好了!

epggiuax

epggiuax1#

你可以在这里尝试更新连接。下面的方法是为原始表和值的“数组”分配一个有序序列以进行更新。我们使用模逻辑进行连接,这样表的序列顺序将与数组中的值匹配,并将环绕,直到分配完所有值。

WITH cte AS (
    SELECT *, ROW_NUMBER() OVER (ORDER BY Column1) rn
    FROM yourTable
)

UPDATE t1
SET Column3 = t2.val
FROM cte t1
INNER JOIN
(
    SELECT 1 AS id, 'Value1' AS val UNION ALL
    SELECT 2, 'Value2' UNION ALL
    SELECT 3, 'Value3'
) t2
    ON t2.id = 1 + ((t1.rn - 1) % 3);

演示

p1tboqfb

p1tboqfb2#

假设您可以将“array”放在一个表中,您可以使用以下内容:

with vals as (
      select v.*,
             row_number() over (order by (select null)) - 1 as seqnum,
             count(*) over () as cnt
      from (values ('Value1'), ('Value2'), ('Value3')) v(val)
     )
update t
    set t.column3 = v.val
    from (select t.*,
                 row_number() over (order by column1) - 1 as seqnum
          from t
         ) t join
         vals v
         on t.seqnum % v.cnt = v.seqnum;

其基本思想是枚举每个表中的行,然后使用模运算来匹配它们。

相关问题