|
Как соорудить record set из N строк?
|
|||
---|---|---|---|
#18+
Есть произвольное число N. Нужно с помощью select получить record set из N записей, поля не важны: null null ... null Хранимые процедуры не использовать, с ними все понятно. Должно быть что-то вроде такого Код: sql 1. 2. 3. 4. 5.
где X - таблица с числом записей, заведомо большим N. Но такой таблицы X нет, а N может быть произвольно большим. Чисто игра ума. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.10.2020, 21:18 |
|
Как соорудить record set из N строк?
|
|||
---|---|---|---|
#18+
shalamyansky, execute block - тоже нельзя? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.10.2020, 21:24 |
|
Как соорудить record set из N строк?
|
|||
---|---|---|---|
#18+
shalamyansky Чисто игра ум ... |
|||
:
Нравится:
Не нравится:
|
|||
12.10.2020, 21:27 |
|
Как соорудить record set из N строк?
|
|||
---|---|---|---|
#18+
Код: plsql 1. 2. 3. 4. 5. 6.
... |
|||
:
Нравится:
Не нравится:
|
|||
12.10.2020, 21:33 |
|
Как соорудить record set из N строк?
|
|||
---|---|---|---|
#18+
execute block... это, возможно, решение, если смотреть практически. А из PSQL тоже можно вызывать execute block, и for execute block делать? Но это не очень интересное решение, просто обход запрета на хранимую процедуру. Давайте предположим, что нельзя. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.10.2020, 21:37 |
|
Как соорудить record set из N строк?
|
|||
---|---|---|---|
#18+
Dimbuch® Код: plsql 1. 2. 3. 4. 5. 6.
Класс! Все решается, однако. Даже не подумал в сторону RECURSIVE. Спасибо! ... |
|||
:
Нравится:
Не нравится:
|
|||
12.10.2020, 21:40 |
|
Как соорудить record set из N строк?
|
|||
---|---|---|---|
#18+
Dimbuch® Код: plsql 1. 2. 3. 4. 5. 6.
Классно. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.10.2020, 21:41 |
|
Как соорудить record set из N строк?
|
|||
---|---|---|---|
#18+
Dimbuch® Код: plsql 1. 2. 3. 4. 5. 6.
Только вот как реализована эта рекурсия сервером? При N порядка миллиона-миллиарда не лопнет ли у него стек? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.10.2020, 22:24 |
|
Как соорудить record set из N строк?
|
|||
---|---|---|---|
#18+
shalamyansky, глубина рекурсии ограничена 1023 уровнями. Если надо генерировать числа больше 1000 можно использовать r cross join r ... |
|||
:
Нравится:
Не нравится:
|
|||
12.10.2020, 22:30 |
|
Как соорудить record set из N строк?
|
|||
---|---|---|---|
#18+
Симонов Денис глубина рекурсии ограничена 1023 уровнями. Если надо генерировать числа больше 1000 можно использовать r cross join r Да... уже увидел. А жаль. Возводить r в степень не так красиво. Но можно, 2 раза cross join - уже миллиард. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.10.2020, 22:43 |
|
Как соорудить record set из N строк?
|
|||
---|---|---|---|
#18+
Отдельно запрос все равно не нужен. Он будет в процедуре скорее всего. Ну или в EXECUTE BLOCK. Тогда вставить эту конструкцию целиком в WHILE .. И подставлять вместо начальной единицы переменную. Выводить записи через SUSPEND или в таблицу. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
Получится почти бесконечная последовательность Ну или как сказали через CROSS JOIN ... |
|||
:
Нравится:
Не нравится:
|
|||
12.10.2020, 22:44 |
|
Как соорудить record set из N строк?
|
|||
---|---|---|---|
#18+
Не, ну если в руках есть while и suspend, то вопросов вообще нет :) Код: sql 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
12.10.2020, 22:49 |
|
Как соорудить record set из N строк?
|
|||
---|---|---|---|
#18+
shalamyansky, Просто WHILE не сджоинить с каким-нибудь набором записей. Только по одной получится. Например можно сгенерить таблицу с датами каждый час за весь месяц. И соединить с событиями. В обычном while придётся искать по одной за одну итерацию ... |
|||
:
Нравится:
Не нравится:
|
|||
12.10.2020, 22:54 |
|
Как соорудить record set из N строк?
|
|||
---|---|---|---|
#18+
Dimbuch® Просто WHILE не сджоинить с каким-нибудь набором записей ИМХО можно как-нибудь проще, чем через рекурсию. Но это мы далеко отклонились от темы. Вопрос был - как получить искомое в рамках SQL, но не PSQL. Вы дали красивое решение, но оно увы, имеет сильное ограничение. Денис и Вы подсказали, как его можно расширить через cross join. Да, наверное, так и надо. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.10.2020, 23:05 |
|
Как соорудить record set из N строк?
|
|||
---|---|---|---|
#18+
shalamyansky Вопрос был - как получить искомое в рамках SQL ... join NN on n<100 ... |
|||
:
Нравится:
Не нравится:
|
|||
13.10.2020, 10:28 |
|
Как соорудить record set из N строк?
|
|||
---|---|---|---|
#18+
А рекурсию внутри рекурсии можно? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.10.2020, 10:28 |
|
Как соорудить record set из N строк?
|
|||
---|---|---|---|
#18+
Проверил, нельзя. WITH clause can't be nested. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.10.2020, 10:39 |
|
Как соорудить record set из N строк?
|
|||
---|---|---|---|
#18+
Exteris А рекурсию внутри рекурсии можно? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.10.2020, 11:24 |
|
Как соорудить record set из N строк?
|
|||
---|---|---|---|
#18+
shalamyansky, там есть одна хитрость. CROSS JOIN заставит выполнять рекурсивный запрос каждый раз. Это несколько дорого, поэтому можно придумать искусственный трюк, так чтобы выполнялся HASH JOIN. Например в данном запросе для генерации миллиарда записей рекусрсивный запрос будет выполнен всего три раза вместо миллиона Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Код: 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. 25. 26. 27. 28.
Обрати внимание, потребовался всего 21 фетч а вот кросс джойном Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
Код: 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. 25.
... |
|||
:
Нравится:
Не нравится:
|
|||
13.10.2020, 11:53 |
|
Как соорудить record set из N строк?
|
|||
---|---|---|---|
#18+
Симонов Денис, Max memory заодно сравни, нужно учитывать все факторы ... |
|||
:
Нравится:
Не нравится:
|
|||
13.10.2020, 12:08 |
|
Как соорудить record set из N строк?
|
|||
---|---|---|---|
#18+
hvlad, ага сразу не обратил внимание. Но время получилось лучше. Хотя для большого количества пользователей, лучше память экономить ... |
|||
:
Нравится:
Не нравится:
|
|||
13.10.2020, 12:20 |
|
Как соорудить record set из N строк?
|
|||
---|---|---|---|
#18+
Симонов Денис поэтому можно придумать искусственный трюк, так чтобы выполнялся HASH JOIN. Хитро. Не очень соображаю, почему так получается, но это повод для подумать. Спасибо! ... |
|||
:
Нравится:
Не нравится:
|
|||
13.10.2020, 18:51 |
|
Как соорудить record set из N строк?
|
|||
---|---|---|---|
#18+
Я думал, вы отшутились и всё на этом. А вы на полном серьёзе... Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
... |
|||
:
Нравится:
Не нравится:
|
|||
14.10.2020, 11:53 |
|
Как соорудить record set из N строк?
|
|||
---|---|---|---|
#18+
Логично. Тогда уж вот так, чтобы без лишней пересортировки: Код: sql 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.
Спасибо! ... |
|||
:
Нравится:
Не нравится:
|
|||
14.10.2020, 17:47 |
|
Как соорудить record set из N строк?
|
|||
---|---|---|---|
#18+
Можно "обмануть" ограничение рекурсии: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
В данном случае запрос уже вернёт 369510 строк, что как бы существенно выше ограничения на глубину рекурсий. А всё дело в том, что в данном случае формируется обрезанное бинарное дерево (обрезанное, потому что не из всех узлов выходят новые ветки) и рекурсия ограничена глубиной этого дерева - в данном случае глубина всего на всего 10. Ставить 1023 вместо 10 не рекомендую. Да, сервер это съест но значений будет всё же слишком много. Даже 20 не советую. Сервер будет, мягко говоря, очень долго вычислять результат. :) Вот так сходу вывести математическую формулу, зависимости N от глубины дерева, чтобы однозначно решить задачу, я не готов. А ведь можно ещё добавить третье поле и третий UNION... И четвёртое поле с четвёртым UNION-ом.... Ну вы поняли... ... |
|||
:
Нравится:
Не нравится:
|
|||
15.10.2020, 11:29 |
|
|
start [/forum/topic.php?fid=40&fpage=11&tid=1560228]: |
0ms |
get settings: |
10ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
42ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
53ms |
get tp. blocked users: |
1ms |
others: | 235ms |
total: | 370ms |
0 / 0 |