2016-01-16 3 views
3

У меня есть эти 2 таблицыUPDATE 2 столбца таблицы значений из таблицы

Table P 

A  | B | C  | D  
----------------------------- 
'abc' | NULL | 'kkk' | NULL 
'xyz' | NULL | 'www' | NULL 
'pqr' | NULL | 'ccc' | NULL 


Table Q 

X  | Y 
----------------------------- 
'abc' | 123 
'xyz' | 12 
'pqr' | 34 

мне нужно обновить таблицу Р столбцов В и D со значением Y из таблицы Q до тех пор, как колонке А и C в таблице P

Моего UPDATE теперь соответствует значению столбца X в таблице Q.:

UPDATE TableP 
SET B = Q.Y 
FROM TableQ Q (NOLOCK) 
WHERE Q.X = A 

UPDATE TableP 
SET D = Q.Y 
FROM TableQ Q (NOLOCK) 
WHERE Q.X = C 

Я только знаю, как сделать это в 2-х заявлениях UPDATE, как я могу это сделать в одном UPDATE заявление?

ответ

2

Вы можете использовать UPDATE FROM JOIN:

UPDATE p 
SET B = q1.Y,  --COALESCE(q1.Y, p.B) if needed 
    D = q2.Y   --COALESCE(q2.Y, p.D) 
FROM TableP p 
LEFT JOIN TableQ q1 
    ON p.A = q1.X 
LEFT JOIN TableQ q2 
    ON p.C = q2.X; 

LiveDemo

Выход:

╔═════╦═════╦═════╦═══╗ 
║ A ║ B ║ C ║ D ║ 
╠═════╬═════╬═════╬═══╣ 
║ abc ║ 123 ║ kkk ║ ║ 
║ xyz ║ 12 ║ www ║ ║ 
║ pqr ║ 34 ║ ccc ║ ║ 
╚═════╩═════╩═════╩═══╝ 
2

Использование UPDATE из Join синтаксиса

UPDATE p 
SET B = case when Q.X = p.a then Q.Y else B end, 
    D = case when Q.X = p.c then Q.Y else D end 
FROM TableP p 
INNER JOIN TableQ Q 
    ON Q.X in (p.A,p.C) 
+0

Хммм ... некоторые из столбцов равно будет NULL ... –

+0

@StevenYong - Да Если B или D уже 'NULL'. Он может обрабатываться через функцию ISNULL –

+0

Когда все значения в столбцах A и C из таблицы P существуют в столбце X таблицы Q, некоторые из столбцов имеют значение NULL. Скажем, «kkk», «www», «ccc» также находятся в таблице Q. –

1

Попробуйте

UPDATE TableP 
    SET B = CASE WHEN Q.X = A THEN Q.Y ELSE B END, 
     D = CASE WHEN Q.X = C THEN Q.Y ELSE D END 
    FROM TableQ Q (NOLOCK) 

Однако я пропустил присоединиться. Таким образом, это мое решение обновляется

UPDATE TableP 
    SET B = CASE WHEN Q.X = A THEN Q.Y ELSE B END, 
     D = CASE WHEN Q.X = C THEN Q.Y ELSE D END 
    FROM TableQ Q (NOLOCK) 
    INNER JOIN TableP P 
    ON P.A = Q.X 
+3

В этом заявлении отсутствует соединение с TableP. –