【问题标题】:Update column with the same value for all rows that have the same value in another column为另一列中具有相同值的所有行更新具有相同值的列
【发布时间】:2022-01-06 23:04:43
【问题描述】:

鉴于以下示例表架构和数据:

create table Example(
   Id int not null,
   Col1 int not null,
   Col2 uniqueidentifier null,
);
insert into Example 
values 
(1, 1, NULL), (2, 1, NULL), (3, 1, NULL), (4, 2, NULL), (5, 3, NULL), (6, 3, NULL)

生成:

Id Col1 Col2
1 1 NULL
2 1 NULL
3 1 NULL
4 2 NULL
5 3 NULL
6 3 NULL

如果可能的话,我希望帮助我编写一个脚本,该脚本将根据 Col1 的相同值更新具有相同 newid() 的所有行的 Col2。

脚本执行后que表的Ex:

Id Col1 Col2
1 1 bad34c74-f546-4d79-804b-d048d8c7d977
2 1 bad34c74-f546-4d79-804b-d048d8c7d977
3 1 bad34c74-f546-4d79-804b-d048d8c7d977
4 2 e464b79a-b97c-4192-a4f3-327cc147cc4a
5 3 99475e8f-2788-4c63-817f-4deb130440ab
6 3 99475e8f-2788-4c63-817f-4deb130440ab

非常感谢您的帮助

【问题讨论】:

  • 除非这是删除 Col1 的临时步骤,否则这表示归一化问题,因为 Col2 在功能上依赖于 Col1。您应该有另一个具有不同 Col1 的表及其关联的 Col2
  • 感谢您的回复。是的。我明白。但是对于这个具体的例子,我只对问题/解决方案本身感兴趣,请忽略规范化问题。

标签: sql sql-server tsql


【解决方案1】:

一种方法是分两步完成。

UPDATE Example
SET Col2 = NEWID()

UPDATE e1
SET Col2 = e2.Col2
FROM Example e1
CROSS APPLY (SELECT TOP 1 *
             FROM Example
             WHERE Col1 = e1.Col1
             ORDER BY Col2) e2

【讨论】:

    【解决方案2】:

    这也可以通过公用表表达式来完成。 UNIONrequired 以便子查询实现。

    WITH cte AS
    (
        SELECT Col1, NEWID() AS UniqueID
        FROM Example
        GROUP BY Col1
        UNION
        SELECT NULL, NEWID()
    )
    UPDATE e
    SET Col2 = cte.UniqueID
    FROM Example e
    INNER JOIN cte ON cte.Col1 = e.Col1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-14
      • 2012-05-25
      • 1970-01-01
      • 1970-01-01
      • 2017-11-07
      • 2019-05-31
      • 2017-12-24
      相关资源
      最近更新 更多