powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / преобразование IN в EXISTS
11 сообщений из 11, страница 1 из 1
преобразование IN в EXISTS
    #38963577
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Firebird-2.5-LangRef-Update.pdf, page 87Queries like:
...where F1 in (select first 5 F2 from Table2 order by 1 desc)

won't work as expected, because the optimization performed by the engine transforms the IN predicate to
the correlated EXISTS predicate shown below. It's obvious that in this case FIRST N doesn't make any sense:

...where exists(
select first 5 F2 from Table2
where Table2.F2 = Table1.F1
order by 1 desc)


Что-то изменилось по этому поводу, потому как Таблоид мне показал такой тест

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
SQL> recreate table test(id int); commit;
SQL> insert into test select row_number()over() from rdb$types rows 10; commit;

SQL> select * from test t1 where t1.id IN (select first 3 t2.id from test t2 order by 1 desc);

ID
============
 8
 9
 10

SQL> select * from test t1 where exists (select first 3 id from test t2 where t1.id = t2.id order by 1 desc);

ID
============
 1
 2
 3
 4
 5
 6
 7
 8
 9
 10

вот тут как раз IN выдал то что я и ожидал и не похоже что он в такой EXISTS преобразовался
...
Рейтинг: 0 / 0
преобразование IN в EXISTS
    #38963599
Симонов Денис,

Секцию where из EXISTS-подзапроса убери.
Иначе он у тебя не эквивалентен тому, что делает IN-подзапрос...
Код: sql
1.
select * from test t1 where exists (select first 3 id from test t2  order by 1 desc);
...
Рейтинг: 0 / 0
преобразование IN в EXISTS
    #38963603
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый Э - Эх,

он и в этом случае не эквивалентен
...
Рейтинг: 0 / 0
преобразование IN в EXISTS
    #38963693
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вынеси where наружу first, через derived table. Получишь эквивалент.
...
Рейтинг: 0 / 0
преобразование IN в EXISTS
    #38963706
m7m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,

не понял, а с чего это он должен был преобразовать с использованием EXISTS ?
ибо насколько я понимаю тест Таблоида подтверждает то что написано английским по белому
...
Рейтинг: 0 / 0
преобразование IN в EXISTS
    #38963781
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m7m,

в переводе там написано

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Такие запросы, как
...
WHERE F1 IN (SELECT FIRST 5 F2
FROM TABLE2
ORDER BY 1 DESC)

не будут работать, как ожидалось, т.к. оптимизатор сервера
преобразует предикат IN в предикат EXISTS, как показано ниже.
Очевидно, что в этом случае использование указания FIRST N не имеет
никакого смысла:
...
WHERE EXISTS (SELECT FIRST 5 F2
FROM TABLE2
WHERE TABLE2.F2 = TABLE1.F2
ORDER BY 1 DESC)

что в общем-то не подтверждается
...
Рейтинг: 0 / 0
преобразование IN в EXISTS
    #38963798
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitr,

Код: sql
1.
2.
3.
4.
5.
6.
select *
from test t1
where exists (
  select *
  from (select first 3 id from test order by 1 desc) t2
  where t2.id = t1.id);



ага. Похоже на правду. Значит этот пункт в документации ересь и его надо от туда убрать.
Похоже он туда перекочевал ещё до изобретения derived table и сейчас потерял актуальность
...
Рейтинг: 0 / 0
преобразование IN в EXISTS
    #38963868
__Avenger__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисSQL> select * from test t1 where exists (select first 3 id from test t2 where t1.id = t2.id order by 1 desc);

ID
============
1
2
3
4
5
6
7
8
9
10

Объясните, пожалуйста, почему этот запрос так работает?
...
Рейтинг: 0 / 0
преобразование IN в EXISTS
    #38963878
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
__Avenger__,

потому что exists переводится как если существует хотя бы одна запись. Поэтому можно ставить туда хоть first 1, хоть first 1000.
...
Рейтинг: 0 / 0
преобразование IN в EXISTS
    #38963901
__Avenger__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис__Avenger__,

потому что exists переводится как если существует хотя бы одна запись. Поэтому можно ставить туда хоть first 1, хоть first 1000.

Ну да, вообще логично.
...
Рейтинг: 0 / 0
преобразование IN в EXISTS
    #38963993
m7m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денисm7m,
в переводе там написано
...
что в общем-то не подтверждается
Ну дошло теперь до меня.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / преобразование IN в EXISTS
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]