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

У меня есть 2 таблицы: Таблица1 и Таблица2. В обеих таблицах есть столбец с именем Column2.

Я хочу установить все значения Table1.Column1 как NULL для всех записей, которых нет в Table2. т.е. все записи, где Table1.Column2 ‹> Table2.Column2.

Это запрос, который я пытаюсь выполнить:

UPDATE a
SET a.Column1 = null
FROM Table1 a
INNER JOIN Table2 b
ON a.Column2 <> b.Column2

Я получаю ошибку динамического SQL «Token Unknown» на «FROM», когда пытаюсь выполнить этот запрос.

Любая идея, что я делаю неправильно? Я новичок в SQL, поэтому есть большая вероятность, что я использую неправильный тип соединения.


person GarethH    schedule 30.10.2014    source источник
comment
Хотя в этом случае (установить нуль, если нет соответствия) невозможно в базе данных Firebird, в подобных случаях можно использовать MERGE   -  person ghord    schedule 12.07.2016


Ответы (4)


Firebird не поддерживает соединения в UPDATE-операторах, вместо этого вам нужно будет сделать что-то вроде этого:

UPDATE Table1
   SET Column1 = NULL
WHERE NOT EXISTS (
   SELECT 1 
   FROM Table2 
   WHERE Table2.Column2 = Table1.Column2
)

Однако это, похоже, указывает на отсутствующее ограничение внешнего ключа (от Table1 до Table2), которое принудило бы к этому (или запретило бы удаление записей в Table2, если бы они использовались в Table1).

person Mark Rotteveel    schedule 01.11.2014

Ваша потребность не очень ясна, поскольку вы не упомянули, как связаны Table1 и Table2, кроме Column2, поэтому я предполагаю, что такой столбец является присоединяемым. Вам нужно включить в запрос измененную таблицу с псевдонимом, как-то вроде «курсора»:

UPDATE Table1 ***Table1_0***   
   SET Column1 = NULL  
WHERE
 (select Column2 from Table2 where (Column2 = ***Table1_0***.Column2) is null 

если совпадение найдено, то условие вернет значение, а часть «is null» будет ложной, и строка будет обновлена.

person alvaroc    schedule 27.02.2015

Это определенно работает на Firebird 2.5:

update CREATOR c
set ALPHAINDEXID = 
(select ai.alphaindexid
from ALPHAINDEX ai
where ai.alphaindexletter = substring(c.creatorname from 1 for 1)
and ai.roleid = 5)
person Lyndon    schedule 03.10.2017

Это должно работать в Firebird.

UPDATE a
SET a.Column1 = null
FROM Table1 a
LEFT OUTER JOIN Table2 b ON a.Column2 = b.Column2
WHERE b.Column2 IS NULL
person LeeG    schedule 30.10.2014
comment
Это не так, Firebird не поддерживает соединения в обновлениях. - person Mark Rotteveel; 01.11.2014