Это будет синтаксис SQL-сервер будет, и я уверен, что это пересекает, но я видел несколько статей, которые предлагают другой синтаксис для MySQL. Но в основном используйте предложение join
или where
, которое будет relate
таблиц, а затем используйте оператор case
, чтобы выбрать ваше значение. В приведенном ниже решении вы никогда не будете использовать ELSE
оператора case
, но для хорошей ссылки на меру укажите текущее значение столбца для всего, что соответствовало бы вашему join
, но не условиям вашего заявления case
.
Использование РЕГИСТРИРУЙТЕСЬ
UPDATE a
SET Column1 = CASE
WHEN b.Column1 = 1111 THEN b.Column2
WHEN b.Column1 = 2222 THEN b.Column3
ELSE a.Column1
END
FROM
[DatabaseA].TableA a
INNER JOIN [DatabaseB].TableB b
ON a.Column4 = b.Column4
AND (
(b.Column1 = 1111 AND b.Column2 IS NOT NULL)
OR
(b.Column1 = 2222 AND b.Column3 IS NOT NULL)
)
За ваш комментарий не использования объединения.
UPDATE a
SET Column1 = CASE
WHEN b.Column1 = 1111 THEN (SELECT b.Column2 FROM TableB WHERE b.Column4 = a.Column4)
WHEN b.Column1 = 2222 THEN (SELECT b.Column3 FROM TableB WHERE b.Column4 = a.Column4)
ELSE a.Column1
END
FROM
TableA
WHERE
EXISTS (
SELECT *
FROM
TableB
WHERE
b.Colmn4 = a.Column4
AND (
(b.Column1 = 1111 AND b.Column2 IS NOT NULL)
OR
(b.Column1 = 2222 AND b.Column3 IS NOT NULL)
)
Это выглядит сумасшедшим, но оно только обновит строки, которые вы намереваетесь. В противном случае, если вам все равно, обновите ли вы весь столбец, вы можете сделать что-то подобное.
UPDATE a
SET Column1 = CASE
WHEN b.Column1 = 1111 THEN ISNULL((SELECT b.Column2 FROM TableB WHERE b.Column4 = a.Column4 AND b.Column1 = 1111),a.Column1)
WHEN b.Column1 = 2222 THEN ISNULL((SELECT b.Column3 FROM TableB WHERE b.Column4 = a.Column4 AND b.Column1 = 2222),a.Column1)
ELSE a.Column1
END
FROM
TableA
Вы также можете сделать это с помощью одного подзаголовка, если вы готовы обновить всю таблицу.
UPDATE a
SET Column1 = ISNULL(
( SELECT (CASE WHEN b.Column1 = 1111 THEN b.Column2 ELSE b.Column3 END)
FROM
TableB
WHERE
b.Colmn4 = a.Column4
AND (
(b.Column1 = 1111 AND b.Column2 IS NOT NULL)
OR
(b.Column1 = 2222 AND b.Column3 IS NOT NULL)
)
),a.Column1)
FROM
TableA
Хитрость во всех этих ответов, вы должны быть в состоянии связать ВЫБЕРИТЕ заявление TableB с TableA иначе вы не получите ваш предполагаемый результат.
Вы должны использовать операторы case, чтобы разрешить запрос устанавливать значения на разных условиях, подобных вам. Это похоже на вашу проблему: http://stackoverflow.com/questions/35533828/how-to-combine-two-update-queries-having-different-where-condition. – Dresden
Поскольку ваши запросы теперь читаются, между таблицей А и таблицей Б нет связи. Это верно? – nscheaffer
@ Дрезден, дело в том, что утверждения case не позволяют мне «выбирать из того, где» –