|
Выбрать одну строку из множества в условии join
|
|||
---|---|---|---|
#18+
Внезапно обнаружил, что в версии Oracle 10g работают функции inet_aton/inet_ntoa (раньше думал, что они доступны только с версии 11 и приходилось использовать громоздкие выражения). И тут же образовалась задача, где эти функции хотелось бы применить. Есть запрос, возвращающий набор строк, в одной из которых содержится IP-адрес. Есть вспомогательная таблица с подсетями: Код: plsql 1. 2. 3. 4. 5. 6. 7.
Подсети могут быть вложенными, то есть в большой подсети (с широкой MASK) может быть несколько более мелкий подсетей. Маска битовая и широкая маска означает меньшее число установленных битов. Принадлежность адреса к подсети определяется таким выражением: Код: plsql 1.
Но для вложенных подсетей такое выражение возвращает несколько строк, которые дублируются в итоговой выборке. Мне нужно в случае вложенных подсетей выбрать одну с наиболее узкой маской (маской с максимальным числовым значением). Ранее и в другом месте я делал так: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9.
Но это было самосоединение (чтобы таблицу INV_RES_IP4 отобразить в виде иерархии). А можно ли обойтись без подзапроса с группировкой, а прямо в условии join указать соединение с определенной строкой? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2021, 10:33 |
|
Выбрать одну строку из множества в условии join
|
|||
---|---|---|---|
#18+
Сейчас у меня сделано так: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
То есть значительную часть запроса я просто повторил внутри подзапроса, что мне не нравится. Если использовать WITH, то визуально запрос будет красивее (лаконичнее), но как я понимаю, WITH вызывает материализацию, что мне кажется нежелательным. В таблице CURSESSIONS число строк невелико (тысячи), но таблица RADACCT большая, там сотни миллионов и миллиарды записей. По RADACCTID есть индекс, соединение между CURSESSIONS и RADACCT работает быстро (доли секунды), но весь приведенных запрос исполняется секунд 15-20. Если убрать в конце сортировку, то раза в 3-4 быстрее, но все равно хотелось бы ускорить. Не посоветуете, как улучшить запрос? Лучше всего было бы вообще избегать лишних подзапросов и группировок, а сразу выполнить джойн с одной нужной строкой — но я не могу ее знать без IP-адреса от вышестоящих строк. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2021, 12:18 |
|
Выбрать одну строку из множества в условии join
|
|||
---|---|---|---|
#18+
Alibek B. Внезапно обнаружил, что в версии Oracle 10g работают функции inet_aton/inet_ntoa (раньше думал, что они доступны только с версии 11 ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2021, 14:39 |
|
|
start [/forum/topic.php?fid=52&fpage=21&tid=1880247]: |
0ms |
get settings: |
12ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
80ms |
get topic data: |
15ms |
get forum data: |
3ms |
get page messages: |
65ms |
get tp. blocked users: |
2ms |
others: | 260ms |
total: | 459ms |
0 / 0 |