Tente esta versão em vez disso:
DELETE FROM startpoint
WHERE id IN (select *
from ((SELECT id FROM stairs WHERE building = 123)
UNION
(SELECT id FROM lift WHERE building = 123)
UNION
(SELECT id FROM qrcodeid WHERE building = 123)
)
Eu acho que o problema é um problema misterioso com a definição de uma subconsulta. Uma subconsulta é um
select
declaração, enquanto uma union
é uma conjunção de select
declarações. EDITAR:
Na verdade, se você quer eficiência, não usaria essa abordagem. Eu estava apenas tentando mostrar como corrigir o erro. Uma solução melhor seria:
DELETE sp FROM startpoint sp
WHERE EXISTS (select 1 from stairs s where s.building = 123 and s.id = sp.id) or
EXISTS (select 1 from lift l where l.building = 123 and l.id = sp.id) or
EXISTS (select 1 from qrcodeid q where q.building = 123 and q.id = sp.id);
Índices são recomendados em
stairs(id, building)
, lift(id, building)
e qrcodeid(id, building)
.