2017-02-02 3 views
1

Я искал всюду, но я не могу заставить его работать или понять, почему соединение ведет себя так и сейчас. Я не могу никого спросить, поэтому просто пытаюсь удачи здесь. Так вот вопрос:Обновить столбец таблицы с данными из другой таблицы

tblOldAccess

User  Srv Perm LogDtTm 
------------------------------------------------ 
TestNm1 Srv1 Perm1 2016-09-20 00:00:00.000 
TestNm1 Srv2 Perm2 2016-05-30 00:00:00.000 
TestNm1 Srv1 Perm3 2016-05-30 00:00:00.000 

tblNewAccess

User  Srv Perm LogDtTm 
------------------------------------------------ 
TestNm1 Srv1 Perm1 2016-11-20 00:00:00.000 
TestNm1 Srv2 Perm2 2016-12-30 00:00:00.000 
TestNm1 Srv1 Perm4 2017-02-01 21:50:32.197 

Если есть же пользователя, СРВ и Пермь между 2 таблиц, я хотел обновить tblOldAccess tabke с текущим LogDtTm от tblNewAccess вот так

Желаемый результат - tblOldAccess

User  Srv Perm LogDtTm 
    ------------------------------------------------ 
    TestNm1 Srv1 Perm1 2016-11-20 00:00:00.000 
    TestNm1 Srv2 Perm2 2016-12-30 00:00:00.000 
    TestNm1 Srv1 Perm3 2016-05-30 00:00:00.000 

Я могу получить строки, которые имеют ту же информацию для пользователя, Srv, Пермь через INTERSECT команду, однако я не в состоянии правильно их подключить, чтобы получить что-то вроде этого:

UPDATE [tblOldAccess] 
    SET [LogDtTm] = [tmp].[LogDtTm] 
FROM tblOldAccessas tmp 
JOIN (
    SELECT [user], Srv, [Perm] from [tblNewAccess] 
    INTERSECT 
    SELECT [user], Srv, [Perm] from [tblOldAccess] 
) as drv 
ON tmp.[User] = drv.[User] 
WHERE tmp.[User] = drv.[User] 
AND tmp.[Srv] = drv.[Srv] 

Я пробовал несколько условий соединения и даже несколько, где условие только для обновления этих двух строк, которые соответствуют тем, которые нуждаются в обновлении в своем столбце LogDtTm в таблице tblOldAccess. Любой вход был бы оценен.

+0

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

+0

Вы заглянули в ['MERGE'] (https://msdn.microsoft.com/en-us/library/bb510625.aspx)? Я считаю, что вы можете получить желаемый результат таким образом. – 3N1GM4

ответ

0

Попробуйте это:

UPDATE old 
SET old.[LogDtTm] = new.[LogDtTm] 
FROM tblOldAccess old 
INNER JOIN tblNewAccess new ON old.[User] = new.[User] AND 
           old.[Srv] = new.[Srv] AND 
           old.[Perm] = new.[Perm] 

Примечание: Во-первых Возьмите резервную копию данных

+0

(0 строк (а)) на моем конце приятеля. также я побежал 'SELECT * FROM tblOldAccess old INNER JOIN tblNewAccess new ON старый. [Пользователь] = новый. [Пользователь] И старый. [Srv] = новый. [Srv] AND старый. [Perm] = новый. [Perm] ' , и он дал мне пустой стол –

+0

Хмм, похоже, это проблема с данными. может возникнуть вероятность не найти соответствия в соответствии с нашим условием объединения. –

+0

вот что я тоже думаю, так как раньше я пробовал этот подход, и он также возвращал 0 строк. Я проверю данные на моем конце. –

0

Проверьте уровень сортировки, так как вы присоединяетесь строковых типов данных. Может быть, это поможет вам.

+0

Привет, я уже проверил все сопоставления (DB и столбцы), и все они проверяют, так что это не проблема с сортировкой. –

0

Спасибо всем, кто помог! Я, наконец, сумел отследить проблему и, к сожалению (ее разочарование), это просто нулевое значение в некоторых строках во всей таблице, что помешало JOIN функционировать должным образом. Вот некоторые documentation. Я создал работу вокруг этого, используя COALESCE, и теперь он отлично работает! Всем спасибо! Если кому-то интересно, вот мой синтаксис:

UPDATE old 
    SET old.[LogDtTm] = new.[LogDtTm] 
FROM [tblOldAccess] as old 
INNER JOIN [tbNewAccess] new 
    ON COALESCE(old.[User],'noValue') = COALESCE(new.[User],'noValue') 
    AND COALESCE(old.[Srv],'noValue') = COALESCE(new.[Srv],'noValue') 
    AND COALESCE(old.[Perm],'noValue') = COALESCE(new.[Perm],'noValue')