Сравните 2 столбца таблицы и обновите новый столбец

55
6

У меня есть 2 таблицы:

enter image description here

enter image description here

Например, в первой строке из таблицы 2 значение col равно 3661, а его значение равно "med" из таблицы 1. Я хочу обновить класс из таблицы 1 с помощью "MED" и...

Это код, который я написал, но что-то не так :(

UPDATE table1 SET
class = ( CASE
WHEN table2.col = table1.med
THEN 'MED'
--------------------------------
WHEN table2.col = table1.mgl
THEN 'MGL'
--------------------------------
WHEN table2.col = table1.rhp
THEN 'RHP'
--------------------------------
WHEN table2.col = table1.epd
THEN 'EPD'
--------------------------------
WHEN table2.col = table1.jpa
THEN 'JPA'
--------------------------------
ELSE 'NULL'
FROM
table1 LEFT outer JOIN table2
)

спросил(а) 2014-09-27T19:01:00+04:00 5 лет, 9 месяцев назад
1
Решение
56

Я редактировал ваш код. вы не указали, какую базу данных вы используете. В любом случае попробуйте следующее:

   UPDATE table1 
SET class = ( CASE
WHEN table2.col = table1.med
THEN 'MED'
--------------------------------
WHEN table2.col = table1.mgl
THEN 'MGL'
--------------------------------
WHEN table2.col = table1.rhp
THEN 'RHP'
--------------------------------
WHEN table2.col = table1.epd
THEN 'EPD'
--------------------------------
WHEN table2.col = table1.jpa
THEN 'JPA'
--------------------------------
ELSE 'NULL'
END)
from table1 left join table2 on table1.number=table2.number

ответил(а) 2014-09-27T19:16:00+04:00 5 лет, 9 месяцев назад
54

Вы хотите что-то вроде этого:

UPDATE table1
SET class = COALESCE((SELECT MIN(CASE WHEN table2.col = table1.med THEN 'MED'
WHEN table2.col = table1.mgl THEN 'MGL'
. . .
END) as newval
FROM table2
), 'NULL')

Это немного сложно. Вам нужно решить, какую строку вы хотите, если есть несколько совпадений. Вышеизложенное выбирает произвольное значение среди матчей.


coalesce() предназначен для обработки случая, когда совпадений нет. В этом случае подзапрос возвращает NULL.

Это стандартный SQL и должен работать в любой базе данных. У конкретных баз данных могут быть другие способы написания этого запроса.

ответил(а) 2014-09-27T19:13:00+04:00 5 лет, 9 месяцев назад
38

Пробовал это в MySQL, это работает

UPDATE Table1 
INNER JOIN Table1 T1
LEFT JOIN Table2 T2
ON T1.number = T2.number
set T1.class =
( CASE
WHEN T2.col = T1.med
THEN 'MED'
WHEN T2.col = T1.mgl
THEN 'MGL'
WHEN T2.col = T1.rhp
THEN 'RHP'
WHEN T2.col = T1.epd
THEN 'EPD'
WHEN T2.col = T1.jpa
THEN 'JPA'
ELSE 'NULL'
END
)

EDIT: в случае MS SQL SERVER вы можете использовать это

UPDATE Table1 
set class =
( CASE
WHEN T2.col = T1.med
THEN 'MED'
WHEN T2.col = T1.mgl
THEN 'MGL'
WHEN T2.col = T1.rhp
THEN 'RHP'
WHEN T2.col = T1.epd
THEN 'EPD'
WHEN T2.col = T1.jpa
THEN 'JPA'
ELSE 'NULL'
END
)
FROM Table1 T1
LEFT JOIN Table2 T2
ON T1.number = T2.number

ответил(а) 2014-09-27T19:43:00+04:00 5 лет, 9 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема