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

标签 sql-server tsql

我有一个名为 FavoriteFruits 的表,其中包含 NAMEFRUITGUID 列。 table 上已经写满了名字和水果。所以我们可以说:

NAME      FRUIT       GUID
John      Apple       NULL
John      Orange      NULL
John      Grapes      NULL
Peter     Canteloupe  NULL
Peter     Grapefruit  NULL

好的,现在我想用新的 GUID 更新 GUID 列(使用 NEWID()),但我想要每个不同的名称具有相同的GUID。因此,我希望所有 John Smiths 具有相同的 GUID,并且我希望 Peters 具有相同的 GUID code>,但该 GUID 与 Johns 使用的不同。所以现在它看起来像这样:

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

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

谢谢大家...

最佳答案

更新 CTE 不起作用,因为 it'll evaluate per row 。表变量可以工作:

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

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

这样就可以用每个名称的 GUID 填充变量,然后将其连接回原始表并进行相应更新。

关于sql-server - 用于更新列中具有相同值的行的 T-SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7871048/

相关文章:

asp.net - Sql Server中如何保存HTML数据

sql-server - 只返回存储过程的最后一个选择结果

sql-server - TSQL 更改游标定义

sql - 如何获取数据透视表每行的最大列数和最小列数?

sql - 需要在 SQL Server 中透视字符串值

sql-server - DateDiff 函数 SQL Server

asp.net - 在 ASP.NET 中发送大量电子邮件

在 Microsoft SQL 2008 上运行的 MySql 仿真

mysql - SQL - 使用 Case、When 对不同行的值求和

sql - SQL中如何按时间分组