![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Соединение таблиц на основе НЕвхождения
B © (2005-09-01 15:11:00)Такой вопрос наверняка всплывал много раз, но не знаю как искать...
Задача - получить записи, которые НЕ входят в подзапрос:
Select T.*
from BASE1 T,(SELECT ttt.text bas_text, ttt.id bas_id
FROM o_tree ttt
CONNECT BY ttt.owner_id = PRIOR ttt.id
START WITH ttt.id = 288007) tree
Если задать
where T.id IN bas_id
все нормально - возвращаются только строки, входящие в позапрос
Если задать
where T.id NOT IN bas_id
В ответ возвращается сонмище строк, кажется, оно называется Декартовым.
Fay (2005-09-01 18:06:00) [1]B (01.09.05 17:20) [6]
Oracle, что-ли? Надо сразу говорить.
Val (2005-09-01 17:25:00) [2]может что-то типа этого:
Select T.*
from BASE1 T
where not exists (SELECT 1
FROM o_tree ttt
where ttt.id = t.id
CONNECT BY ttt.owner_id = PRIOR ttt.id
START WITH ttt.id = 288007) tree
B (2005-09-01 17:20:00) [3]Спасибо.
MINUS, похоже, подошел.
ANB (2005-09-01 17:18:00) [4]
> B (01.09.05 16:54) [3]
1. Читать в справке описание not exists
2. Тут лучше not in
Desdechado (2005-09-01 17:05:00) [5]в Оракле есть в SELECT такая хитрая опция MINUS - не оно ли это?
B (2005-09-01 16:54:00) [6]Это Oracle...
Он так тоже позволяет, результат будет тем же
Но в силу того, что надо проверять и другие данные из позапроса приходится писать его в FROM
NOT EXISTS не помог :(
Выражение
elect distinct T.*
from Base1 T
where exists (SELECT ttt.text bas_text, ttt.id bas_id
FROM o_tree ttt
CONNECT BY ttt.owner_id = PRIOR ttt.id
START WITH ttt.id = 288007)
вернуло то же что и IN,
а если заменить на NOT EXISTS, вообще ничего не возвращает :(
Виталий Панасенко (2005-09-01 15:18:00) [7]Это MS SQL ? С им не работал, но в стандарте вроди так
select * from table where id not in (select id from table2 where ...)
DenK_vrtz (2005-09-01 15:16:00) [8]Использовать NOT EXISTS