You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于非唯一列更新SQL Server中NULL行的统一GUID

高效解决SQL Server中按分组更新GUID的问题

针对你需要将dbo.Products表中Product_Ref_Id为NULL的记录,按Product_Name统一更新GUID(同一名称对应同一GUID)的需求,无需循环的高效方案如下:

核心实现代码

WITH ProductGuids AS (
    SELECT 
        Product_Name,
        NEWID() AS New_Guid
    FROM dbo.Products
    WHERE Product_Ref_Id IS NULL
    GROUP BY Product_Name
)
UPDATE p
SET p.Product_Ref_Id = pg.New_Guid
FROM dbo.Products p
INNER JOIN ProductGuids pg 
    ON p.Product_Name = pg.Product_Name
WHERE p.Product_Ref_Id IS NULL;

代码说明

  1. CTE预生成分组GUID:通过CTE ProductGuids 筛选出所有Product_Ref_Id为NULL的记录,按Product_Name分组后为每个组生成唯一的GUID(NEWID()),确保同一名称对应同一个GUID。
  2. 关联更新原表:将原表与CTE通过Product_Name关联,仅更新原表中Product_Ref_Id为NULL的记录,把对应分组的GUID批量写入。

额外注意事项

  • 如果Product_Name存在大小写不一致、首尾空格等情况,可以通过统一格式化字段来保证分组准确性,例如修改CTE和关联条件:
    WITH ProductGuids AS (
        SELECT 
            LOWER(LTRIM(RTRIM(Product_Name))) AS Formatted_Name,
            NEWID() AS New_Guid
        FROM dbo.Products
        WHERE Product_Ref_Id IS NULL
        GROUP BY LOWER(LTRIM(RTRIM(Product_Name)))
    )
    UPDATE p
    SET p.Product_Ref_Id = pg.New_Guid
    FROM dbo.Products p
    INNER JOIN ProductGuids pg 
        ON LOWER(LTRIM(RTRIM(p.Product_Name))) = pg.Formatted_Name
    WHERE p.Product_Ref_Id IS NULL;
    
  • 该方案采用SQL集合操作,避免了循环迭代的低效问题,同时绕开了直接在UPDATE中使用GROUP BY的语法限制。

内容的提问来源于stack exchange,提问作者Viswa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 00:49:56