Выбираем данные из некоторой таблички:
SELECT foo,bar FROM table1 WHERE условия;
Всё отлично, данные выбираются. Но мне нужны не все, а только те, которые не встречаются в другой табличке.Проверяю парочку:
SELECT * FROM table2 WHERE foo='foo1';
Ура, ничего не находится. Значит, они должны появиться в итоговой выборке. Пишем окончательный запрос:
SELECT foo,bar FROM table1 WHERE условия AND foo NOT IN (SELECT foo FROM table2);
И.. получаем индейскую национальную избу. 0 rows, и всё тут. Данных в table2 совершенно точно нет, но и из table1 они выбираться перестали.
Профессиональные DBA уже, наверное, догадались, в чём дело, но поскольку я не, мне на это понадобилось минут 10..
Оригинал этой записи. Комментировать можно тут или там.
Любые материалы из этого блога запрещается использовать на сайте livejournal.ru в любой форме и любом объёме
Tags:
no subject
no subject
no subject
SELECT foo,bar FROM table1 WHERE условия
AND foo NOT IN (SELECT foo FROM table2 WHERE foo IS NOT NULL);
no subject
в общем _windwalker_ прав. Только есть нюанс преджойн и постджойн предикаты. В информиксе надо использовать ansi синтаксис left outer join, синтаксис outer не подойдет (он все предикаты воспринимает как преджойн).
а я бы написал:
SELECT foo,bar FROM table1 WHERE условия
AND not exists (SELECT 1 FROM table2 WHERE table1.foo=foo);
no subject
no subject
С другой стороны оптимизатор умеет одно превращать в другое. Надо план смотреть.