按组

时间:2016-06-04 20:09:50

标签: sql-server tsql

请考虑以下表格:

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

2 个答案:

答案 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

更新产品表

所有声明。