首页 > 解决方案 > 如何将表变量中的所有不同值分配给表中现有行中的字段?

问题描述

我有一个表变量 ( @tableVar),其中有一列 ( tableCol) 的唯一值。

我有一个包含许多现有行的目标表,其中还有一个完全用 NULL 值填充的列。

对于目标表中的每一行,我可以使用什么类型的语句来迭代@tableVar并为空字段分配不同的值?@tableVar.tableCol

*编辑(提供信息)我的目标表具有以下结构:

+-------+------------+
| Name  | CallNumber |
+-------+------------+
| James | NULL       |
| Byron | NULL       |
| Steve | NULL       |
+-------+------------+

我的表变量有这个结构

+------------+
| CallNumber |
+------------+
|       6348 |
|       2675 |
|       9898 |
+------------+

我需要为目标表中的每一行分配一个不同的索书号,以实现这种结果。

+-------+------------+
| Name  | CallNumber |
+-------+------------+
| James |       6348 |
| Byron |       2675 |
| Steve |       9898 |
+-------+------------+

注意:每一行不需要特定的 CallNumber。唯一的要求是每一行都有一个唯一的 CallNumber。例如,“詹姆斯”并不特别需要 6348;他可以有任何数字,只要它是唯一的,并且唯一的数字必须来自表变量。您可以假设表变量将有足够的 CallNumber 来满足此要求。

我可以为此结果使用什么类型的查询?

标签: sqlsql-servertsql

解决方案


您可以使用update带有序列号的 an:

with toupdate as (
      select t.*, row_number() over (order by (select null)) as seqnum
      from target t
     )
update toupdate
     set col = tv.tablecol
     from (select tv.*, row_number() over (order by (select null)) as seqnum
           from @tablevar tv
          ) tv
     where tv.seqnum = toupdate.seqnum;

这假设@tablevar有足够数量的行来分配 in target。如果没有,我建议您使用示例数据和所需结果提出一个新问题。

是一个 db<>fiddle。


推荐阅读