MySQL和PostgreSQL中UPDATE的WHERE子句不可直接用NOT IN引用同一表子查询,需用派生表(SELECT * FROM (...) AS tmp)隔开;若子查询含NULL,NOT IN恒为UNKNOWN,须加IS NOT NULL过滤;LEFT JOIN...IS NULL更稳定、避NULL、易读且性能可控。
NOT IN 子查询在 UPDATE 中直接用会报错 MySQL 和 PostgreSQL 都不支持在 UPDATE 语句的 WHERE 子句里,直接用NOT INUPDATE t SET x=1 WHERE id NOT IN (SELECT id FROM t WHERE flag=1)You can't specify target table 't' for update in FROM clausetable name "t" specified more than onceNOT INSELECT * FROM (...) AS tmpNULLNOT INUNKNOWNIS NOT NULLUPDATE users
SET status = 'archived'
WHERE id NOT IN (
SELECT id FROM (
SELECT id FROM users WHERE created_at > '2023-01-01'
) AS tmp
);idSELECT * FROM (...) AS tmptmpNOT INNULLWHERE id IS NOT NULLNOT INLEFT JOIN ... IS NULLUPDATE users u
LEFT JOIN (
SELECT id FROM users WHERE created_at > '2023-01-01'
) AS exclude ON u.id = exclude.id
SET u.status = 'archived'
WHERE exclude.id IS NULL;NULLexcludeLEFT JOINNOT INAS tmpSELECT user_idNOT INidNOT INtoo many terms in compound SELECTLEFT JOIN