请考虑以下表格:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Product](
[ProductID] [int] IDENTITY(1,1) NOT NULL,
[ProductCategory] [int] NOT NULL,
[ProductCategoryGuid] [uniqueidentifier] NULL,
CONSTRAINT [PK_Product] PRIMARY KEY CLUSTERED
(
[ProductID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET IDENTITY_INSERT [dbo].[Product] ON
GO
INSERT [dbo].[Product] ([ProductID], [ProductCategory], [ProductCategoryGuid]) VALUES (1, 2, NULL)
GO
INSERT [dbo].[Product] ([ProductID], [ProductCategory], [ProductCategoryGuid]) VALUES (2, 2, NULL)
GO
INSERT [dbo].[Product] ([ProductID], [ProductCategory], [ProductCategoryGuid]) VALUES (3, 2, NULL)
GO
INSERT [dbo].[Product] ([ProductID], [ProductCategory], [ProductCategoryGuid]) VALUES (4, 3, NULL)
GO
INSERT [dbo].[Product] ([ProductID], [ProductCategory], [ProductCategoryGuid]) VALUES (5, 4, NULL)
GO
INSERT [dbo].[Product] ([ProductID], [ProductCategory], [ProductCategoryGuid]) VALUES (6, 2, NULL)
GO
INSERT [dbo].[Product] ([ProductID], [ProductCategory], [ProductCategoryGuid]) VALUES (7, 3, NULL)
GO
INSERT [dbo].[Product] ([ProductID], [ProductCategory], [ProductCategoryGuid]) VALUES (8, 4, NULL)
GO
INSERT [dbo].[Product] ([ProductID], [ProductCategory], [ProductCategoryGuid]) VALUES (9, 4, NULL)
GO
SET IDENTITY_INSERT [dbo].[Product] OFF
GO
数据如下所示:
ProductID ProductCategory ProductCategoryGuid
1 2 NULL
2 2 NULL
3 2 NULL
4 3 NULL
5 4 NULL
6 2 NULL
7 3 NULL
8 4 NULL
9 4 NULL
我想要实现的是更新[ProductCategoryGuid]列,以便[ProductCategory]中具有相同值的所有行在[ProductCategoryGuid]列中具有相同的Guid值
澄清:
Guid值将使用NEWID()函数
生成为UPDATE查询的一部分ProductID IN(1,2,3,6)的行将具有Guid1
ProductID为IN(4,7)的行将具有Guid2
ProductID为IN(5,8,9)的行将具有Guid3
答案 0 :(得分:2)
我会使用以下脚本使用表变量来存储不同类别的列表。相同的表变量具有GUID列,其具有默认值NEWID()
函数。在脚本的末尾有一个UPDATE
语句,使用表变量作为源,dbo.Product
表作为目标:
DECLARE @Results TABLE (
[ProductCategory] [int] NOT NULL,
[ProductCategoryGuid] [uniqueidentifier] NOT NULL DEFAULT (NEWID())
)
INSERT @Results (ProductCategory)
SELECT DISTINCT p.ProductCategory
FROM dbo.Product p
UPDATE p
SET ProductCategoryGuid = r.ProductCategoryGuid
OUTPUT deleted.ProductCategoryGuid, inserted.ProductCategoryGuid
FROM dbo.Product p
INNER JOIN @Results r ON p.ProductCategory = r.ProductCategory
如果您不想查看旧值和新值,请注释OUTPUT
子句。
更新:一个语句解决方案(需要SQL2012 +)
;WITH CteUpdateProduct
AS (
SELECT *, FIRST_VALUE(NewGUID) OVER(PARTITION BY ProductCategory ORDER BY ProductID) AS NewProductCategoryGuid
FROM (
SELECT p.*, NEWID() AS NewGUID
FROM dbo.Product p
) x
)
UPDATE CteUpdateProduct
SET ProductCategoryGuid = NewProductCategoryGuid
OUTPUT inserted.ProductID, inserted.ProductCategory, inserted.ProductCategoryGuid;
答案 1 :(得分:1)
WITH productCategories as (
SELECT DISTINCT ProductCategory
FROM product
), productCategoriesWithGuid as (
SELECT ProductCategory, NEWID() ProductCategoryGuid
From productCategories
)
UPDATE product
SET ProductCategoryGuid = pc.ProductCategoryGuid
FROM Product p
JOIN productCategoriesWithGuid pc on p.ProductCategory = pc.ProductCategory
此查询获取不同的ProductCategories
为每个人创建一个GUID,
最后使用GUID
更新产品表所有声明。