|
|
|
Поиск префикса максимальной длины
|
|||
|---|---|---|---|
|
#18+
Дано: 1. Таблица с уникальными перфиксами (prefix_list$t). 2. Таблица с выражениями, содержащими префикс (data_4_prefix$t). Требуется: Для каждой строки таблицы data_4_prefix$t найти соответствующую запись в таблице prefix_list$t, такую, что префиксы совпадают и префикс имеет максимальную длину. В приведенных решениях есть недостатки: переключение контекста, не попадание в индекс, громоздкость и неудобство сопровождения. Не могу найти решения на SQL, которое использовало бы индекс и было бы легко изменяемым (увеличение макс. длины префикса, добавление доп. условий при поиске префикса). Тестовые данные: Код: plsql 1. 2. 3. 4. 5. 6. Код: plsql 1. Код: plsql 1. 2. 3. 4. 5. 6. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Варианты решений: Код: plsql 1. 2. 3. Код: plsql 1. 2. 3. 4. 5. 6. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Удаление тестовых объектов БД. Код: plsql 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2016, 15:46:40 |
|
||
|
Поиск префикса максимальной длины
|
|||
|---|---|---|---|
|
#18+
Aandr В приведенных решениях есть недостатки: переключение контекста, Код: plsql 1. 2. 3. Быдлокод. Как можно выбрать максимум подходящую строку из таблицы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2016, 16:02:33 |
|
||
|
Поиск префикса максимальной длины
|
|||
|---|---|---|---|
|
#18+
Aandr, без индекса: Код: plsql 1. 2. 3. 4. 5. 6. 7. с индексом: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. не смотреть А это оптимимальная но использовать нельзя, т.к. не надежно Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. надо еще подумать как это же сделать, но правильно :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2016, 16:09:20 |
|
||
|
Поиск префикса максимальной длины
|
|||
|---|---|---|---|
|
#18+
Elic, блин, точно, перемудрил Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2016, 16:12:12 |
|
||
|
Поиск префикса максимальной длины
|
|||
|---|---|---|---|
|
#18+
xtenderблин, точно, перемудрил Ага, без stopkey-я смешно до слёз. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2016, 16:29:07 |
|
||
|
Поиск префикса максимальной длины
|
|||
|---|---|---|---|
|
#18+
Elic, а у меня под рукой 11.2 только, на нем stopkey не получается нормально... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2016, 16:43:24 |
|
||
|
Поиск префикса максимальной длины
|
|||
|---|---|---|---|
|
#18+
Elic, на 12с сделал бы с fetch first rows, хотя там и в подзапросы можно глубже 1-го уровня пропихивать, но для 11 не вижу нормального решения ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2016, 16:44:47 |
|
||
|
Поиск префикса максимальной длины
|
|||
|---|---|---|---|
|
#18+
xtenderElic, на 12с сделал бы с fetch first rows, хотя там и в подзапросы можно глубже 1-го уровня пропихивать, но для 11 не вижу нормального решенияПроверил и вспомнил, что я уже натыкался на то, что max()keep(dense_rank first/last) не оптимизируется с fetch first rows. Так что только латералы: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2016, 17:02:03 |
|
||
|
Поиск префикса максимальной длины
|
|||
|---|---|---|---|
|
#18+
ElicAandr В приведенных решениях есть недостатки: переключение контекста, Код: plsql 1. 2. 3. Быдлокод. Функцию можно изменить так: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2016, 17:02:04 |
|
||
|
Поиск префикса максимальной длины
|
|||
|---|---|---|---|
|
#18+
Elic, xtender спасибо, но Код: plsql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2016, 17:11:05 |
|
||
|
Поиск префикса максимальной длины
|
|||
|---|---|---|---|
|
#18+
xtenderТак что только латералы:И PL/SQL. Но ты, Саян, в ссылке не заметил главного - NLS-зависимости: Код: plsql 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2016, 17:22:22 |
|
||
|
Поиск префикса максимальной длины
|
|||
|---|---|---|---|
|
#18+
AandrФункцию можно изменить так: Код: plsql 1. Это те же яйца, только в профиль. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2016, 17:23:12 |
|
||
|
Поиск префикса максимальной длины
|
|||
|---|---|---|---|
|
#18+
ElicНо ты, Саян, в ссылке не заметил главного - NLS-зависимости:[SRC plsql][/SRC]ну лингвистик вообще убийца проихводительности, особенно в сочетании с функцией и функциональными индексами, поэтому у меня всегда binary ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2016, 17:36:32 |
|
||
|
Поиск префикса максимальной длины
|
|||
|---|---|---|---|
|
#18+
Остановился на таком варианте Код: plsql 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2016, 18:07:46 |
|
||
|
Поиск префикса максимальной длины
|
|||
|---|---|---|---|
|
#18+
AandrОстановился на таком вариантеКакова кардинальность prefix_list$t? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2016, 18:14:15 |
|
||
|
Поиск префикса максимальной длины
|
|||
|---|---|---|---|
|
#18+
Elic, 10 000 000 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2016, 18:22:32 |
|
||
|
Поиск префикса максимальной длины
|
|||
|---|---|---|---|
|
#18+
AandrElic, 10 000 000 Ошибся Код: plsql 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2016, 18:24:20 |
|
||
|
Поиск префикса максимальной длины
|
|||
|---|---|---|---|
|
#18+
Если префиксы только цифровые, то можно так Код: plsql 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2016, 18:27:04 |
|
||
|
Поиск префикса максимальной длины
|
|||
|---|---|---|---|
|
#18+
Aandr Код: plsql 1. Тогда ты остановился на непроизводительном варианте: каждый поиск будет шерстить в среднем половину индекса последовательным перебором. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2016, 18:34:50 |
|
||
|
Поиск префикса максимальной длины
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2016, 21:17:10 |
|
||
|
Поиск префикса максимальной длины
|
|||
|---|---|---|---|
|
#18+
100 000 префиксов конечно многовато, то зато хорошо параллелится функция... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2016, 21:21:10 |
|
||
|
Поиск префикса максимальной длины
|
|||
|---|---|---|---|
|
#18+
Решение от Q u a d r o100 000 префиксоввероятно имеют множество совпадений по началу и правильнее представить их в виде дерева однобукв. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2016, 00:00:34 |
|
||
|
Поиск префикса максимальной длины
|
|||
|---|---|---|---|
|
#18+
Aandr[/src] Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. ну, если скалярные подзапросы переписать в джойны, то вполне себе решение может получиться. Единственное, что "too many chars, support difficult" такими же и останутся: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2016, 05:28:12 |
|
||
|
|

start [/forum/topic.php?fid=52&fpage=199&tid=1887363]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
46ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
38ms |
get tp. blocked users: |
1ms |
| others: | 219ms |
| total: | 343ms |

| 0 / 0 |
