|
преобразование IN в EXISTS
|
|||
---|---|---|---|
#18+
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.
вот тут как раз IN выдал то что я и ожидал и не похоже что он в такой EXISTS преобразовался ... |
|||
:
Нравится:
Не нравится:
|
|||
20.05.2015, 09:36 |
|
преобразование IN в EXISTS
|
|||
---|---|---|---|
#18+
Симонов Денис, Секцию where из EXISTS-подзапроса убери. Иначе он у тебя не эквивалентен тому, что делает IN-подзапрос... Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
20.05.2015, 09:53 |
|
преобразование IN в EXISTS
|
|||
---|---|---|---|
#18+
Добрый Э - Эх, он и в этом случае не эквивалентен ... |
|||
:
Нравится:
Не нравится:
|
|||
20.05.2015, 09:57 |
|
преобразование IN в EXISTS
|
|||
---|---|---|---|
#18+
Вынеси where наружу first, через derived table. Получишь эквивалент. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.05.2015, 10:39 |
|
преобразование IN в EXISTS
|
|||
---|---|---|---|
#18+
Симонов Денис, не понял, а с чего это он должен был преобразовать с использованием EXISTS ? ибо насколько я понимаю тест Таблоида подтверждает то что написано английским по белому ... |
|||
:
Нравится:
Не нравится:
|
|||
20.05.2015, 10:44 |
|
преобразование IN в EXISTS
|
|||
---|---|---|---|
#18+
m7m, в переводе там написано Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
что в общем-то не подтверждается ... |
|||
:
Нравится:
Не нравится:
|
|||
20.05.2015, 11:21 |
|
преобразование IN в EXISTS
|
|||
---|---|---|---|
#18+
dimitr, Код: sql 1. 2. 3. 4. 5. 6.
ага. Похоже на правду. Значит этот пункт в документации ересь и его надо от туда убрать. Похоже он туда перекочевал ещё до изобретения derived table и сейчас потерял актуальность ... |
|||
:
Нравится:
Не нравится:
|
|||
20.05.2015, 11:26 |
|
преобразование IN в EXISTS
|
|||
---|---|---|---|
#18+
Симонов Денис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 Объясните, пожалуйста, почему этот запрос так работает? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.05.2015, 12:11 |
|
преобразование IN в EXISTS
|
|||
---|---|---|---|
#18+
__Avenger__, потому что exists переводится как если существует хотя бы одна запись. Поэтому можно ставить туда хоть first 1, хоть first 1000. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.05.2015, 12:16 |
|
преобразование IN в EXISTS
|
|||
---|---|---|---|
#18+
Симонов Денис__Avenger__, потому что exists переводится как если существует хотя бы одна запись. Поэтому можно ставить туда хоть first 1, хоть first 1000. Ну да, вообще логично. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.05.2015, 12:26 |
|
|
start [/forum/topic.php?fid=40&fpage=76&tid=1562841]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
43ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
44ms |
get tp. blocked users: |
2ms |
others: | 13ms |
total: | 142ms |
0 / 0 |