2017-02-22 21 views
0

Я работаю с T-SQL. У меня две таблицы: полное имя и таблица SSN. В таблице SSN есть 10000+ записей с именем, фамилией и столбцом ssn. В таблице fullname есть 100 записей с именем и фамилией.T-SQL - обновлять все строки, даже если повторяющиеся данные

Я хочу обновить таблицу SSN с именами имен и фамилий от имени. В конце 100 записей я просто хочу повторить имена (начиная с строки 1 полного имени), пока не завершит обновление всех записей в таблице SSN. Я попытался выполнить MERGE, как показано ниже, но получил сообщение «СООБЩЕНИЕ MERGE, пытающееся ОБНОВИТЬ или УДАЛИТЬ одну и ту же строку более одного раза». В этом коде ниже я пытался сначала обновить столбец [фамилия]. Вы можете помочь? Благодарю.

MERGE INTO [SSN] 
    USING [fullname] 
     ON 1=1 
    WHEN MATCHED THEN 
    UPDATE 
     SET [last name] = [fullname].[last name]; 
+1

Так уточнить: (1) Вы не заботитесь о том, какое имя присваивается КОТОРЫХ ПЛА, но вы хотите использовать вращение 100 имен, а не просто использовать одно имя, не так ли? (2) Имеются ли в таблицах последовательные столбцы идентификаторов? –

+0

(1) Нет, это не имеет значения. Нет совпадения имени с SSN. Это будут все тестовые данные. (2) Только SSN имеет столбцы последовательных идентификаторов, но при необходимости я могу добавить последовательный идентификатор в таблицу имен. – ray500

+0

Пожалуйста, скажите, что вы не храните SSN в ясном тексте. Я понимаю, что вы генерируете тестовые данные, но SSN необходимо зашифровать в любое время. –

ответ

1

UPDATE - исправления и объяснения

Если обе таблицы имеют последовательные идентификаторы, то вы можете изменить свое положение ON в

ON [fullname].[ID] = [SSN].[ID] % 100 

Идея заключается в том, для каждого [SSN].[ID] вам нужно выберите ровно один [fullname].[ID], а оператор % (целочисленный деление или по модулю) дает нам один способ сделать это, выбрав каждый [fullname] запись примерно столько же раз.

fullname 0 matches SSN 0, 100, 200, 300, ... 
fullname 1 matches SSN 1, 101, 201, 301, ... 

Для того, чтобы работать, не оставляя никаких пробелов, что вам нужно [fullname] записи с каждой [ID] значения от 0 до 99. Если первый [ID] является 1, вы можете настроить это сказать

ON [fullname].[ID] = ([SSN].[ID] % 100) + 1 

предполагая у вас есть запись [fullname] с [ID] из 100. Если у вас есть другое количество итоговых записей [fullname], вы можете изменить их после %.

+0

Если вам не удается добавить отсутствующий идентификатор, вы можете * подделать его с помощью 'row_number() over()'; но я скептически настроен (и не в состоянии запускать тесты прямо сейчас) –

+0

Спасибо, я попробую, но обновит ли все 10000+ строк? – ray500

+0

Спасибо, Марк, это тоже сработало. – ray500

1

Вы можете сделать это с помощью инструкции обновления по этим строкам. Это предполагает отсутствие пробелов в ssnTable.RowNumber (или независимо от вашего фактического имени). Если у вас есть пробелы, это довольно простой шаг для использования RowNumber.

update s 
set LastName = fn.FullName 
from ssnTable s 
join 
(
    select ROW_NUMBER() over(order by LastName) as RowNum 
     , LastName 
    from FullName 
) fn on fn.RowNum = s.RowNumber % 100 
+0

Спасибо, Шон, это сработало! – ray500