Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Задачка про newid()  [new]
rozen
Member

Откуда:
Сообщений: 41
Довольно давно не могу найти изящного решения для задачи, упрощённо сводящейся к следующей:

CREATE TABLE [TestTable] (
	[Name] [nvarchar](10) NOT NULL,
	[ID] [uniqueidentifier] NULL
)
go
INSERT [dbo].[TestTable] ([Name]) VALUES (N'Alice')
INSERT [dbo].[TestTable] ([Name]) VALUES (N'Bob')
INSERT [dbo].[TestTable] ([Name]) VALUES (N'Alice')
INSERT [dbo].[TestTable] ([Name]) VALUES (N'John')
INSERT [dbo].[TestTable] ([Name]) VALUES (N'Jane')
INSERT [dbo].[TestTable] ([Name]) VALUES (N'Jane')
GO


Хочется написать ОДНУ команду update, чтобы создать и присвоить значения в поле [ID] так, чтобы они были одинаковыми для строк с одинаковыми значениями в поле [Name]

Использовать временную таблицу мне кажется неизящным.
Пока мне удалось найти только такой вариант из 2 команд:
update TestTable set ID = newid();

;with T as (
	select Name, ID, row_number() over (partition by Name order by rand()) as _rn
	from TestTable
)
update T1 set ID = T2.ID 
from T T1 join T T2 on T1.Name = T2.Name and T2._rn = 1 and T1._rn > 1;
22 мар 18, 20:30    [21278844]     Ответить | Цитировать Сообщить модератору
 Re: Задачка про newid()  [new]
step_ks
Member

Откуда:
Сообщений: 936
https://www.sql.ru/forum/1282577-1/kak-poluchit-odinakovyy-guid
https://www.sql.ru/forum/596277/newid-po-gruppe
22 мар 18, 20:43    [21278861]     Ответить | Цитировать Сообщить модератору
 Re: Задачка про newid()  [new]
rozen
Member

Откуда:
Сообщений: 41
step_ks, спасибо за наводку, нашел в обеих темах намёк на идеальное (с моей точки зрения) решение.
;with T as (
	select *, first_value(newid()) over (partition by [Name] order by rand()) as new_id
	from TestTable
)
update T set ID = new_id
22 мар 18, 20:57    [21278879]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить