SQL Query для обновления столбца на основе значений других столбцов в одной таблице

Хорошо, что это сложно назвать фразой, поэтому здесь идет …

Я использую MS SQL Server 2008 R2. У меня есть временная таблица, которая позволяет использовать два уже заполненных столбца. Существует третий пустой столбец, который я хочу заполнить, исходя из значения первых двух столбцов. Я хочу создать guid (используя NEWUID ()) для каждой соответствующей комбинации col1 и col2. Вот наглядный пример:

Допустим, у меня есть временная таблица, которая выглядит так:

Name Activity SpecialId James Running James Running James Walking John Running John Running John Walking 

Я хочу, чтобы он обновлялся с новыми GUID, чтобы он выглядел так:

 Name Activity SpecialId James Running SOMEFAKEGUID_1 James Running SOMEFAKEGUID_1 James Walking SOMEFAKEGUID_2 John Running SOMEFAKEGUID_3 John Running SOMEFAKEGUID_3 John Walking SOMEFAKEGUID_4 

Обратите внимание, как создается новый GUID для каждой пары. Итак, у James / Running combo есть тот же идентификатор GUID для всех комбайнов James / Running … и у John / Running также есть тот же GUID для комбо John / Running, но не тот же GUID, что и комманды James / Running.

Я попытался сделать это максимально ясным, но, надеюсь, это не ясно, как грязь!

Может ли кто-нибудь показать мне, как будет выглядеть запрос SQL, чтобы обновить эту временную таблицу с правильными идентификаторами GUID?

Заранее спасибо.

Райан

Использование NEWID () кажется болью . Используя его, CTE создает идентификатор спермы, поэтому вместо этого вам нужна некоторая таблица-посредник.

 Declare @Table as table (name varchar(20), activity varchar(20) , SpecialID uniqueidentifier) Declare @DistinctTable as table (name varchar(20), activity varchar(20) , SpecialID uniqueidentifier) INSERT INTO @Table (name, activity) values ('James','Running'), ('James','Running'), ('James','Walking'), ('John','Running'), ('John','Running'), ('John','Walking') WITH distinctt AS (SELECT DISTINCT name, activity FROM @Table) INSERT INTO @DistinctTable SELECT name, activity, Newid() FROM distinctt UPDATE @Table SET specialid = dt.specialid FROM @Table t INNER JOIN @DistinctTable dt ON t.activity = dt.activity AND t.name = dt.name SELECT * FROM @Table 

Производит

 name activity SpecialID -------------------- -------------------- ------------------------------------ James Running AAA22BC5-51FE-43B3-8CC9-4C4A5B4CC981 James Running AAA22BC5-51FE-43B3-8CC9-4C4A5B4CC981 James Walking 1722B76B-5F17-4931-8D7C-2ECADB5A4DFD John Running FBC1F86B-592D-4D30-ACB3-80DA26B00900 John Running FBC1F86B-592D-4D30-ACB3-80DA26B00900 John Walking 84282844-AAFD-45CA-9218-F7933E5102C6 

Я уверен, что есть лучшие способы сделать это, но вы можете попробовать следующее:

 WITH TableId AS ( SELECT DISTINCT Name, Activity FROM YourTable ) UPDATE A SET A.SpecialId = B.SpecialId FROM YourTable A INNER JOIN (SELECT Name, Activity, NEWID() SpecialId FROM TableId) B ON A.Name = B.Name AND A.Activity = B.Activity 

Ну, я знаю, что вы не используете mySQL, но так оно и будет работать в mySQL (проверено)

 update temp_table, ( select uuid() as spec_key, name, activity from ( select distinct name, activity from temp_table) as anotherTemp) as anotheranotherTemp set specialID = anotheranotherTemp.spec_key where temp_table.Activity = anotheranotherTemp.activity and temp_table.Name = anotheranotherTemp.name; 

Он СМОТРЕТЬ, как это будет работать в SQL 2008 (не проверено)

 MERGE INTO temp_table AS tt USING ( select newId() as spec_key, name, activity from ( select distinct name, activity from temp_table) as anotherTemp ON anotherTemp.activity = tt.activity and anotherTemp.name = tt.name WHEN MATCHED THEN UPDATE SET specialID = anotherTemp.spec_key; 

Однако производительность не была бы хорошей.

Давайте будем гением компьютера.