用于更新列中具有相同值的行的T-SQL

Rya*_*yan 8 t-sql sql-server

我有一个表让我们说FavoriteFruits,有NAME,有FRUIT,和GUID列.该表已经填充了名称和水果.所以我们说:

NAME      FRUIT       GUID
John      Apple       NULL
John      Orange      NULL
John      Grapes      NULL
Peter     Canteloupe  NULL
Peter     Grapefruit  NULL
Run Code Online (Sandbox Code Playgroud)

好的,现在我想GUID用新的GUID(使用NEWID())更新列,但我希望GUID每个不同的名称具有相同的名称.所以我希望所有人都John Smiths拥有相同的东西GUID,我希望两者Peters都有相同的东西GUID,但GUID与用于约翰斯的那个不同.所以现在它看起来像这样:

NAME      FRUIT       GUID
John      Apple       f6172268-78b7-4c2b-8cd7-7a5ca20f6a01
John      Orange      f6172268-78b7-4c2b-8cd7-7a5ca20f6a01
John      Grapes      f6172268-78b7-4c2b-8cd7-7a5ca20f6a01
Peter     Canteloupe  e3b1851c-1927-491a-803e-6b3bce9bf223
Peter     Grapefruit  e3b1851c-1927-491a-803e-6b3bce9bf223
Run Code Online (Sandbox Code Playgroud)

我可以在更新语句中执行此操作而无需使用游标吗?如果是这样,请举个例子?

多谢你们...

Mat*_*ton 6

更新 CTE将无法正常工作,因为它将按行进行评估.表变量可以工作:

您应该能够使用表变量作为更新数据的源.这是未经测试的,但它看起来像:

DECLARE @n TABLE (Name varchar(10), Guid uniqueidentifier);

INSERT @n
SELECT Name, newid() AS Guid
FROM FavoriteFruits
GROUP BY Name;

UPDATE f
    SET f.Guid = n.Guid
FROM @n n
    JOIN FavoriteFruits f ON f.Name = n.Name
Run Code Online (Sandbox Code Playgroud)

因此,使用每个名称的GUID填充变量,然后将其连接回原始表并相应地更新.