Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Запрос NOT IN  [new]
Sherst
Member

Откуда:
Сообщений: 222
Привет всем.

Есть 2 таблицы на 20 000 записей. Необходимо выполнить вот такой запрос:

select * from person p where p.id NOT IN (SELECT u.prs_sysno FROM V_ALL_IRBIS_USER u);

Непонятно почему Oracle не может его выполнить. Система просто подвисает. Записей вроде не так много.
20 июл 07, 18:38    [4418034]     Ответить | Цитировать Сообщить модератору
 Re: Запрос NOT IN  [new]
A.K.
Member

Откуда: Пенза
Сообщений: 2571
1. посмотрите план запроса, наличие индексов
2. сравните время выполнения с аналогичным запросом, реализованным через not exists.
20 июл 07, 18:52    [4418098]     Ответить | Цитировать Сообщить модератору
 Re: Запрос NOT IN  [new]
Sherst
Member

Откуда:
Сообщений: 222
Переписал запрос таким образом:

select id from person where NOT EXISTS (SELECT prs_sysno FROM V_ALL_IRBIS_USER) ;
По идее он возвращает такие записи из таблицы Person которых нет в таблице V_ALL_IRBIS_USER?
20 июл 07, 19:18    [4418200]     Ответить | Цитировать Сообщить модератору
 Re: Запрос NOT IN  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116100
Sherst
Переписал запрос таким образом:

select id from person where NOT EXISTS (SELECT prs_sysno FROM V_ALL_IRBIS_USER) ;
По идее он возвращает такие записи из таблицы Person которых нет в таблице V_ALL_IRBIS_USER?


Э. Вы чего то не то написали ...

select id from person p where NOT EXISTS (SELECT null FROM V_ALL_IRBIS_USER
where p.id = prs_sysno) ;

Хотя запросы в общем случае неэквивалентны ...
20 июл 07, 19:25    [4418223]     Ответить | Цитировать Сообщить модератору
 Re: Запрос NOT IN  [new]
Wladislaw
Member

Откуда:
Сообщений: 245
А вы понимаете что вы написали в последнем запросе?
Смотрите, ваш запрос вернёт все
id from person
в случае если в V_ALL_IRBIS_USER нету ни одной записи, если же там есть хоть одна запись, то у вас не будет выбрано ни одной строки. Намёк: вам надо как-то связать person и V_ALL_IRBIS_USER.
20 июл 07, 19:25    [4418224]     Ответить | Цитировать Сообщить модератору
 Re: Запрос NOT IN  [new]
mcureenab
Member

Откуда: Murmansk
Сообщений: 5928
Sherst
Привет всем.

Есть 2 таблицы на 20 000 записей. Необходимо выполнить вот такой запрос:

select * from person p where p.id NOT IN (SELECT u.prs_sysno FROM V_ALL_IRBIS_USER u);

Непонятно почему Oracle не может его выполнить. Система просто подвисает. Записей вроде не так много.


V_ALL_IRBIS_USER - не иначе представление БД. А с представлениями оракл как бы не очень дружит да и ХЗ, насколько сложный запрос скрыт в этом представлении. Скорее всего придётся плотно поработать с планом запроса, например так:

select * from person p where p.id NOT IN (SELECT /*+ no_merge hash_aj +/  u.prs_sysno FROM V_ALL_IRBIS_USER u);
20 июл 07, 20:23    [4418420]     Ответить | Цитировать Сообщить модератору
 Re: Запрос NOT IN  [new]
mcureenab
Member

Откуда: Murmansk
Сообщений: 5928
dmidek


select id from person p where NOT EXISTS (SELECT null FROM V_ALL_IRBIS_USER
where p.id = prs_sysno) ;

Хотя запросы в общем случае неэквивалентны ...


Хм. Они могут вернуть разные наборы строк? При каких обстоятельствах?
20 июл 07, 20:26    [4418427]     Ответить | Цитировать Сообщить модератору
 Re: Запрос NOT IN  [new]
dummy_ora_dbd
Guest
mcureenab
Хм. Они могут вернуть разные наборы строк? При каких обстоятельствах?

NULL поля во внутренней выборке
20 июл 07, 20:39    [4418468]     Ответить | Цитировать Сообщить модератору
 Re: Запрос NOT IN  [new]
mcureenab
Member

Откуда: Murmansk
Сообщений: 5928
dummy_ora_dbd
mcureenab
Хм. Они могут вернуть разные наборы строк? При каких обстоятельствах?

NULL поля во внутренней выборке


select 1, t1.* from
 (select to_char(null) n from dual
  union all
  select dummy n from dual
 ) t1
where t1.n not in
 (select to_char(null) n from dual t2
 )
union all
select 2, t1.* from
 (select to_char(null) n from dual
  union all
  select dummy n from dual
 ) t1
where not exists
 (select to_char(null) n from dual t2 where t1.n = to_char(null))
/

    1 N
----- -
    2
    2 X
20 июл 07, 20:58    [4418526]     Ответить | Цитировать Сообщить модератору
 Re: Запрос NOT IN  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116100
mcureenab
dummy_ora_dbd
mcureenab
Хм. Они могут вернуть разные наборы строк? При каких обстоятельствах?

NULL поля во внутренней выборке


select 1, t1.* from
 (select to_char(null) n from dual
  union all
  select dummy n from dual
 ) t1
where t1.n not in
 (select to_char(null) n from dual t2
 )
union all
select 2, t1.* from
 (select to_char(null) n from dual
  union all
  select dummy n from dual
 ) t1
where not exists
 (select to_char(null) n from dual t2 where t1.n = to_char(null))
/

    1 N
----- -
    2
    2 X


Так. И что показал твой пример ?
Попробуй еще вот это

select 1, t1.* from
 (select dummy n from dual
 ) t1
where t1.n not in
 (select to_char(null) n from dual t2
 )
union all
select 2, t1.* from
 (select dummy n from dual
 ) t1
where not exists
 (select to_char(null) n from dual t2 where t1.n = to_char(null))
/
20 июл 07, 21:39    [4418594]     Ответить | Цитировать Сообщить модератору
 Re: Запрос NOT IN  [new]
Winema
Member

Откуда: забугорье
Сообщений: 11
А если так:
********************************
select * from person p, V_ALL_IRBIS_USER u
where p.id = u.prs_sysno (+)
and u.prs_sysno IS NULL
/
21 июл 07, 00:04    [4418953]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить