UPDATE table_a a
SET is_active = NOT EXISTS (SELECT FROM table_b b WHERE b.id = a.id);
Предполагается, что оба столбца id
равны NOT NULL
.
Иначе, строки с table_a.id IS NULL
вообще не обновляются в вашем оригинале, поскольку NULL
не является ни IN
, ни NOT IN
каким-либо набором.
И если в table_b.id
имеются какие-либо значения NULL
, то ни один ваших строк не заканчивается на a.is_active = TRUE
, поскольку a.id NOT IN (SELECT id FROM TABLE_B)
равен FALSE
или NULL
, но никогда TRUE
в таком случае. NOT IN
печально известна для такого рода "ловушек". Связанный:
Этот запрос с EXISTS
обновляет все строк. table_a.id IS NULL
приводит к is_active = TRUE
, как и для других идентификаторов, которых нет в table_b
, а значения NULL в table_b.id
не имеют значения.
EXISTS
также привлекателен, в частности, если в table_b.id
может быть (много) повторяющихся значений - лучшая производительность. table_b.id
следует индексировать в любом случае.