|
Приоритет join по длине текстового поля
|
|||
---|---|---|---|
#18+
Допустим, есть такой список сущностей: itemtitle1Белый 12Красный 13Красный 24Красный Плюс 15Желтый Плюс 1 Мне нужно их сгруппировать по категории. Категория является частью (суффиксом) наименования, при этом есть отдельный справочник категорий: catgrp1Белый2Красный3Желтый4Красный Плюс Мне нужно получить такой результат: itemtitlecat1Белый 112Красный 123Красный 224Красный Плюс 145Желтый Плюс 13 Нужно по совпадению имени сопоставить сущность и категорию, причем выбирать только одну категорию, предпочитая категорию с максимальной длиною текста. Можно ли задать для соединения такой предикат, чтобы получить только одну строку соответствующей категории без лишних действий (группировок)? Пока что я делаю примерно так: Код: plsql 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
23.11.2020, 16:08 |
|
Приоритет join по длине текстового поля
|
|||
---|---|---|---|
#18+
Неплохой способ при правильной организации (индекс по cats.grp, NLS_SORT, NLS_COMP сессии соответствует индексу): Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
... |
|||
:
Нравится:
Не нравится:
|
|||
23.11.2020, 16:58 |
|
Приоритет join по длине текстового поля
|
|||
---|---|---|---|
#18+
Alibek B., я б делал через like ps >= чревато если сосем нет соответствия в кратком справочнике ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
23.11.2020, 17:17 |
|
Приоритет join по длине текстового поля
|
|||
---|---|---|---|
#18+
Alibek B., Версия оракла всё так же 10g? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.11.2020, 17:33 |
|
Приоритет join по длине текстового поля
|
|||
---|---|---|---|
#18+
Код: 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.
И: Код: 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.
SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.11.2020, 17:43 |
|
Приоритет join по длине текстового поля
|
|||
---|---|---|---|
#18+
Alibek B. ... Мне нужно получить такой результат: itemtitlecat1Белый 112Красный 123Красный 224Красный Плюс 145Желтый Плюс 13 Нужно по совпадению имени сопоставить сущность и категорию, причем выбирать только одну категорию, предпочитая категорию с максимальной длиною текста. Можно ли задать для соединения такой предикат, чтобы получить только одну строку соответствующей категории без лишних действий (группировок)? Пока что я делаю примерно так: Код: plsql 1. 2. 3. 4.
Попробуйте так: Код: plsql 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
23.11.2020, 19:18 |
|
Приоритет join по длине текстового поля
|
|||
---|---|---|---|
#18+
SY Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Соломон, в политбюро не дураки сидят - на Солнце лететь надо ночью ;) Какие планы на 5 строчках, о чем это было? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.11.2020, 22:24 |
|
Приоритет join по длине текстового поля
|
|||
---|---|---|---|
#18+
Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
23.11.2020, 22:58 |
|
Приоритет join по длине текстового поля
|
|||
---|---|---|---|
#18+
Спасибо за советы. Делал через substr, а не через like, из-за старых привычек, в прикладном десктопном программировании вырезать фрагмент строки в десятки раз быстрее работы с шаблонами или регулярными выражениями. Как я понимаю, напрасно. Да, версию указать забыл, 10g. Это к сожалению исключает fetch first. Но даже замена substr на like наверное улучшит запрос. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.11.2020, 23:59 |
|
Приоритет join по длине текстового поля
|
|||
---|---|---|---|
#18+
Alibek B. Спасибо за советы. Делал через substr, а не через like, из-за старых привычек, в прикладном десктопном программировании вырезать фрагмент строки в десятки раз быстрее работы с шаблонами или регулярными выражениями. Как я понимаю, напрасно. Да, версию указать забыл, 10g. Это к сожалению исключает fetch first. Но даже замена substr на like наверное улучшит запрос. Мой вариант должен сработать и на Oracle 10g. Проверьте на реальных данных. Конечно, коррелированный запрос - это не слишком эффективно, но работать должно. Предполагаю, что в плане для реальных таблиц будет Nested Loops, и поможет индекс по TITLE. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2020, 00:41 |
|
Приоритет join по длине текстового поля
|
|||
---|---|---|---|
#18+
SQL*Plus, Остроумная подстановка неравенства строчек вместо неравенства длины. Как такое провернуть для case-insrnsitive сравнений? Везде добавить upper()? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2020, 02:16 |
|
Приоритет join по длине текстового поля
|
|||
---|---|---|---|
#18+
andrey_anonymous о чем это было? Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
Код: plaintext 1. 2. 3. 4. 5. 6. 7.
...... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2020, 09:50 |
|
Приоритет join по длине текстового поля
|
|||
---|---|---|---|
#18+
НеофитSQL провернуть для case-insrnsitive сравнений зависит от версии Код: plsql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2020, 10:11 |
|
Приоритет join по длине текстового поля
|
|||
---|---|---|---|
#18+
SQL*Plus Мой вариант должен сработать и на Oracle 10g. Проверьте на реальных данных. Да, отлично работает, быстрее моего. Правда не пойму, как переделать его на left join, чтобы для несопоставленных сущностей (например "Зеленый 1") в результате была категория null. Но это я наверное уже сам смогу решить. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2020, 10:41 |
|
|
start [/forum/topic.php?fid=52&tid=1880674]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
142ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
56ms |
get tp. blocked users: |
2ms |
others: | 15ms |
total: | 260ms |
0 / 0 |