|
Помогите улучшить запрос
|
|||
---|---|---|---|
#18+
Доброе время суток! Помогите пожалуйста улучшить запрос. Есть таблица table_a, в ней поле cust_ID и таблица table_b, в ней поле cust_ID и doc_date. В table_b м.б. несколько записей с одним cust_ID и разными doc_date, в т.ч. одинаковыми. Надо соединить по cust_ID строку из table_a с ОДНОЙ строкой из table_b, с максимальной датой. Если даты одинаковые, то первая, какая нашлась. Я сделала с помощью CTE Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
Но я думаю, что CTE не очень эффективно, с точки зрения потребления ресурсов. Подскажите, как можно улучшить запрос? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2020, 21:51 |
|
Помогите улучшить запрос
|
|||
---|---|---|---|
#18+
Евгения_Д Я сделала с помощью CTE Ну и где тут CTE? Впрочем, вот вам пара типовых вариантов, играйтесь: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41.
... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2020, 22:29 |
|
Помогите улучшить запрос
|
|||
---|---|---|---|
#18+
andrey_anonymous Евгения_Д Я сделала с помощью CTE Ну и где тут CTE? https://jonathanlewis.wordpress.com/2014/02/16/recursive-subquery-factoring/ Personally I prefer to use the expression CTE – common table expression – over “factored subquery” or “subquery factoring” or “with subquery” ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2020, 23:00 |
|
Помогите улучшить запрос
|
|||
---|---|---|---|
#18+
andrey_anonymous, 1) плохой вариант? Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
2) pattern(x+) хуже? ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2020, 09:03 |
|
Помогите улучшить запрос
|
|||
---|---|---|---|
#18+
andrey_anonymous Ну и где тут CTE? А разве это не CTE? Код: plsql 1. 2. 3.
А за варианты спасибо! Именно то, что хотелось. Буду смотреть. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2020, 09:32 |
|
Помогите улучшить запрос
|
|||
---|---|---|---|
#18+
Stax 1) плохой вариант? Почему сразу плохой? Просто я предпочитаю (по возможности и осмысленности) декларировать агрегации и "фильтр-аналитику" на потенциально меньшем наборе и уже потом соединять результат с прочими наборами. Блин, вот написал предложение - и теперь либо пиши целую статью когда этого не надо делать, или обтекай. Буду обтекать, ибо писать статьи не обучен :) Stax 2) pattern(x+) хуже? Не люблю его - заставляет размышлять над define, чтобы не упустить первую запись группы. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2020, 12:12 |
|
Помогите улучшить запрос
|
|||
---|---|---|---|
#18+
Евгения_Д andrey_anonymous Ну и где тут CTE? А разве это не CTE? Поправлюсь: ну и где тут CTE, которое помогло решить задачу? В данном варианте это просто вынесенная декларация inline view, никакого влияния ни на исполнение, ни на декларацию запроса не оказавшее: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2020, 12:20 |
|
Помогите улучшить запрос
|
|||
---|---|---|---|
#18+
andrey_anonymous Stax 1) плохой вариант? Почему сразу плохой? Просто я предпочитаю (по возможности и осмысленности) декларировать агрегации и "фильтр-аналитику" на потенциально меньшем наборе и уже потом соединять результат с прочими наборами. Блин, вот написал предложение - и теперь либо пиши целую статью когда этого не надо делать, или обтекай. Буду обтекать, ибо писать статьи не обучен :) Stax 2) pattern(x+) хуже? Не люблю его - заставляет размышлять над define, чтобы не упустить первую запись группы. об 1) я забыл написать что для случая когда по id в table_b есть индекс (аля сначала соеденить, а потом фильтр) 2) так для такого случая define всеравно вынужден(фальшивый) pattern(strt+ x*) define x as cust_id is not null я так понимаю даж is not null не будет проверятся .... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2020, 12:33 |
|
Помогите улучшить запрос
|
|||
---|---|---|---|
#18+
Stax 1) я забыл написать что для случая когда по id в table_b есть индекс (аля сначала соеденить, а потом фильтр) Если соединение с table_a заметно снижает мощность результирующего множества в сравнении с подмножеством table_b - то лучше анализировать/группировать соединение. Если соединение с table_a не влияет или даже увеличивает мощность результирующего множества в сравнении с подмножеством table_b - то, на мой взгляд, уместнее провести аналитические/агрегирующие/сортирующие операции над более скромным (за счет отсутствия в подмножестве table_b атрибутов table_a) множеством. Как-то так. Нет, не спрашивайте. Я сам запутался :) Stax 2) так для такого случая define всеравно вынужден Define по синтаксису положен. Однако в обсуждаемом варианте, вообще говоря, не так уж важно, что именно там написано - лишь бы не порвало группу раньше времени. По поводу "не будет выполняться" - сомнительно. AFAIK pattern matching не умеет обрывать поиск а-ля "count stop key", он все равно вычерпает rowsource до конца и честно применит pattern. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2020, 12:48 |
|
Помогите улучшить запрос
|
|||
---|---|---|---|
#18+
Евгения_Д, еще вариант: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9.
Это подходит под условие "любой из тех, что с одной и той же датой ". У вас, кстати, дефект сортировки. В вашем варианте надо писать ORDER BY cust_id, doc_date desc ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2020, 12:52 |
|
Помогите улучшить запрос
|
|||
---|---|---|---|
#18+
Stax не будет проверятся Если гарантированно не нужны строки строки замапленные на определенную переменную шаблона (синтаксис {--}) то и в этом случае будет сначала проверка соответствуют ли строки этой переменной. Есть же стандартный дедовский метод [не дающий никаких гарантий] чтоб проверить вызовы. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8.
Код: plsql 1. 2. 3. 4. 5.
Еще раз для ясности: все строки будут проверены на соответсвие шаблону даже если никакие строки кроме первой не интересуют. В этом инструменте [пока?] нет средств ограничить выполнение как в аналитике типа WINDOW ... STOPKEY или WINDOW ... PUSHED RANK. Также стоит уточнить, что если вдруг интересует только первый match_number, то в текущей реализации нет средств остановить проверку после получения первой заматченой группы. Читай страницу 43-44 DEEP DIVE INTO 12c MATCH_RECOGNIZE. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2020, 15:58 |
|
Помогите улучшить запрос
|
|||
---|---|---|---|
#18+
Кобанчег Шаблон применяется ко всем строкам rowsource как уже сообщил синьор Эндрю. это мне было понятно сразу я про какой патерн луче 1) pattern(strt x*) cust_id is not null вычисляется для всех строк в партиции кроме первой 2) pattern(x+) cust_id is not null вычисляется для всех строк 3) pattern(strt+ x) cust_id is not null вычисляется не будет зы насколько я понял х в pattern надо указывать ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2020, 16:45 |
|
Помогите улучшить запрос
|
|||
---|---|---|---|
#18+
Stax насколько я понял х в pattern надо указывать Просто как пример Код: plsql 1. 2. 3. 4. 5. 6. 7. 8.
Я надеюсь это разговор из академического интереса поскольку pattern matching - абсурдный подход для того чтоб взять первую строку из группы (будь то с сортировкой или без). ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2020, 17:50 |
|
Помогите улучшить запрос
|
|||
---|---|---|---|
#18+
Кобанчег Stax насколько я понял х в pattern надо указывать Просто как пример Код: plsql 1. 2. 3. 4. 5. 6. 7. 8.
Я надеюсь это разговор из академического интереса поскольку pattern matching - абсурдный подход для того чтоб взять первую строку из группы (будь то с сортировкой или без). интерес академический (другого у меня счас нет) я имел ввиду что так нельзя Код: plsql 1. 2.
если х описан в define то его надо использовать в pattern pattern(х+) можно ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2020, 18:07 |
|
Помогите улучшить запрос
|
|||
---|---|---|---|
#18+
Stax, Казалось бы зачем может прийти в голову определять правило для несуществующей переменной шаблона... ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2020, 18:42 |
|
Помогите улучшить запрос
|
|||
---|---|---|---|
#18+
Кобанчег Stax, Казалось бы зачем может прийти в голову определять правило для несуществующей переменной шаблона... для фичи Кобанчег Обязательна кляуза define, но не обязательны правила для всех pattern variables. ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
24.04.2020, 09:09 |
|
|
start [/forum/topic.php?fid=52&msg=39950377&tid=1881316]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
155ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
47ms |
get tp. blocked users: |
1ms |
others: | 293ms |
total: | 539ms |
0 / 0 |