Выбираем данные из некоторой таблички:
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
http://pcmag.ru/solutions/detail.php?ID=31704
no subject
no subject
no subject
PS. Только гадаю
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
С другой стороны оптимизатор умеет одно превращать в другое. Надо план смотреть.
no subject