|
Нужное количество строк без использования таблицы
|
|||
---|---|---|---|
#18+
Всем доброго времени суток ! :) Уже голову сломал с тревиальнейшей задачей :( Всё началось с задачи, когда мне в зависимости от какого-то числа (переменой или значения в таблицах) необходимо выбрать количество строк. Вот отвлечённый (не тот для которого мне нужно решение) пример. Есть начальная дата и нам надо от неё построить таблицу чисел на 400 дней. Что может быть проще ?! берём эту дату и начинаем прибавлять к ней номер строки. Весь вопрос откуда его взять. Есть топорный метод, когда делается выборка из таблицы с заранее не меньшим количеством строк (либо она получается перемножением), выводится нормер строки, а потом ставится условие на следующем уровне запроса. Но этот метод не наш ! В некоторых хороших СУБД можно напиать так Код: plaintext 1.
и будет счастье. В Ms SQL Server 2005 есть понятие если не иерархического, то рекурсивного запроса, где при помощи ловкости рук можно построить иерархию. Вот и воспользуемся мы этим CTE Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
Но у нас возникает проблемка, когда уровень РЕКУРСИИ, по которой определяется уровень ИЕРАРХИИ становится больше 100. Сразу скажу что мне этого мало. А очередное перемножение с row_number() - это не дело. Как обойти эту проблему или как убрать ограничение на уровень рекурсии ??? Поиском пользовался. Толком ничего не нашёл к сожалению :( Буду благодарен за помощь. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2008, 17:11 |
|
Нужное количество строк без использования таблицы
|
|||
---|---|---|---|
#18+
NIIIKВсем доброго времени суток ! :) Уже голову сломал с тревиальнейшей задачей :( Всё началось с задачи, когда мне в зависимости от какого-то числа (переменой или значения в таблицах) необходимо выбрать количество строк. Вот отвлечённый (не тот для которого мне нужно решение) пример. Есть начальная дата и нам надо от неё построить таблицу чисел на 400 дней. Что может быть проще ?! берём эту дату и начинаем прибавлять к ней номер строки. Весь вопрос откуда его взять. Есть топорный метод, когда делается выборка из таблицы с заранее не меньшим количеством строк (либо она получается перемножением), выводится нормер строки, а потом ставится условие на следующем уровне запроса. Но этот метод не наш ! В некоторых хороших СУБД можно напиать так Код: plaintext 1.
и будет счастье. В Ms SQL Server 2005 есть понятие если не иерархического, то рекурсивного запроса, где при помощи ловкости рук можно построить иерархию. Вот и воспользуемся мы этим CTE Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
Но у нас возникает проблемка, когда уровень РЕКУРСИИ, по которой определяется уровень ИЕРАРХИИ становится больше 100. Сразу скажу что мне этого мало. А очередное перемножение с row_number() - это не дело. Как обойти эту проблему или как убрать ограничение на уровень рекурсии ??? Поиском пользовался. Толком ничего не нашёл к сожалению :( Буду благодарен за помощь. Код: plaintext
... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2008, 17:13 |
|
Нужное количество строк без использования таблицы
|
|||
---|---|---|---|
#18+
NIIIK Но у нас возникает проблемка, когда уровень РЕКУРСИИ, по которой определяется уровень ИЕРАРХИИ становится больше 100. И какая же это проблемка ? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2008, 17:13 |
|
Нужное количество строк без использования таблицы
|
|||
---|---|---|---|
#18+
Спасибо за столь быстрый ответ ! И что я не подумал что про CT в БОЛ можно почитать :( ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2008, 17:23 |
|
Нужное количество строк без использования таблицы
|
|||
---|---|---|---|
#18+
Не получается Код: plaintext
Использовать в табличной функции. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2008, 17:35 |
|
Нужное количество строк без использования таблицы
|
|||
---|---|---|---|
#18+
Извеняюсь, в неоторых надо писать Код: plaintext 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2008, 17:43 |
|
Нужное количество строк без использования таблицы
|
|||
---|---|---|---|
#18+
>Не получается >OPTION(MAXRECURSION 0) >Использовать в табличной функции. в multi-statement можно. в inline непосредственно в функции не получится. надо указывать maxrecursion в запросе из функции. Posted via ActualForum NNTP Server 1.4 ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2008, 17:49 |
|
Нужное количество строк без использования таблицы
|
|||
---|---|---|---|
#18+
NIIIKНе получается Код: plaintext
Использовать в табличной функции.Внутри inline функции и view действительно нельзя. А в multistatement function - можно. Если нельзя внутри, то всё равно можно - в SELECTе из этих объектов. Неудобно, конечно ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2008, 17:51 |
|
Нужное количество строк без использования таблицы
|
|||
---|---|---|---|
#18+
авторSELECT TOP 400 number FROM master..spt_values WHERE type = 'P' Там таких записей 2048. Большее число - получается декартовым произведением. Наконец в некоторых хорошихъ базах данных всегда присутсвет табличка Number с числоми от ... и до... ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2008, 18:07 |
|
Нужное количество строк без использования таблицы
|
|||
---|---|---|---|
#18+
pkarklin авторSELECT TOP 400 number FROM master..spt_values WHERE type = 'P' Там таких записей 2048. Большее число - получается декартовым произведением. Наконец в некоторых хорошихъ базах данных всегда присутсвет табличка Number с числоми от ... и до... по моему вас не понятен вопрос. 1) вы предлагаете изначально кривой метод; 2) вы не можете управлять количаством строк через TOP, а можете изначально выбрать много записей, а потом поставить where ПОЛЕ < @Переменная, что так же кривой метод. Сейчас же вопрос стоит как написать табличную функцию, потому что: 1) хинт OPTION(MAXRECURSION 0) не работает в функциях 2) процедуру нельзя использовать функции (потому что процедура совсем не процедура, а кусок скрипта с входными/выходными параметрами) Нужна именно табличная функция, потому что: 1) используется в других функциях 2) не хочу писать ни этот кусок запроса везде где мне нужна подобная конструкция, ни объявлять таблицчную переменную потом инсёртить в неё данные (что работает так же только в процедурах) ... |
|||
:
Нравится:
Не нравится:
|
|||
25.04.2008, 11:57 |
|
Нужное количество строк без использования таблицы
|
|||
---|---|---|---|
#18+
Не понимаю, а почему Вы не можете использовать конструкцию Код: plaintext
... |
|||
:
Нравится:
Не нравится:
|
|||
25.04.2008, 12:34 |
|
Нужное количество строк без использования таблицы
|
|||
---|---|---|---|
#18+
авторпо моему вас не понятен вопрос. 1) вы предлагаете изначально кривой метод; Да что Вы говорите?! автор2) вы не можете управлять количаством строк через TOP, а можете изначально выбрать много записей, а потом поставить where ПОЛЕ < @Переменная, что так же кривой метод. Не знаю как Вы, я могу: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9.
Более того, с таким поздапросом (постоянной таблицей Number) обычно JOINятся по условию Код: plaintext 1.
авторНужна именно табличная функция, потому что: 1) используется в других функциях 2) не хочу писать ни этот кусок запроса везде где мне нужна подобная конструкция, ни объявлять таблицчную переменную потом инсёртить в неё данные (что работает так же только в процедурах) Да ради бога, уже давно пора было написать, использовав за основу приведенный мною запрос. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.04.2008, 12:36 |
|
Нужное количество строк без использования таблицы
|
|||
---|---|---|---|
#18+
NIIIK Нужна именно табличная функция, потому что: 1) используется в других функциях 2) не хочу писать ни этот кусок запроса везде где мне нужна подобная конструкция, ни объявлять таблицчную переменную потом инсёртить в неё данные (что работает так же только в процедурах) И что мешает в функции в цикле добавить в табличную переменную нужное число записей ? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.04.2008, 12:37 |
|
Нужное количество строк без использования таблицы
|
|||
---|---|---|---|
#18+
[quot pkarklin] Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9.
Извеняюсь. Хе, действительно синтаксис хрен угадаешь хоть и аналогичен exec (@SQL). Но выбирать из левой таблицы надеюсь всё равно не прийдётся. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.04.2008, 14:21 |
|
Нужное количество строк без использования таблицы
|
|||
---|---|---|---|
#18+
NIIIK[quot pkarklin] Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9.
Извеняюсь. Хе, действительно синтаксис хрен угадаешь хоть и аналогичен exec (@SQL). Но выбирать из левой таблицы надеюсь всё равно не прийдётся.Под "левой" таблицей имеется в виду master..spt_values ? А кто мешает создать свою таблицу с числами, "правую"? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.04.2008, 14:44 |
|
Нужное количество строк без использования таблицы
|
|||
---|---|---|---|
#18+
iapПод "левой" таблицей имеется в виду master..spt_values ? А кто мешает создать свою таблицу с числами, "правую"? Да потому что не нужна мне таблица с которой я не собираюсь брать данные. Потому что это не подход, а фмнт ушами. Я и так знаю что можно использовать запрос с таблицы, но меня от этой мысли протсо коробит. Как это вообще терпеть, что в запросе юзается таблица, которая тебе вообще не нужна. Тем более что в ней всё равно конечное количество записей. Перемножением получать всё равно глупо. Держать таблицу и заполнять её тоже не хочу. Ну должен жи быть метод более красивый ??? Я всё ещё надеюсь что эта функия будет переписана без использования РЕЛЬНОЙ таблицы, данные с которой НЕ ИСПОЛЬЗУЮТСЯ в запросе. Вопрос ведь изначально в этом. На этом заострено внимание. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.04.2008, 17:30 |
|
Нужное количество строк без использования таблицы
|
|||
---|---|---|---|
#18+
NIIIK iapПод "левой" таблицей имеется в виду master..spt_values ? А кто мешает создать свою таблицу с числами, "правую"? Да потому что не нужна мне таблица с которой я не собираюсь брать данные. Потому что это не подход, а фмнт ушами. Я и так знаю что можно использовать запрос с таблицы, но меня от этой мысли протсо коробит. Как же она "не нужна", если вы собрались из нее выбираит записи ? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.04.2008, 17:32 |
|
Нужное количество строк без использования таблицы
|
|||
---|---|---|---|
#18+
Glory NIIIK iapПод "левой" таблицей имеется в виду master..spt_values ? А кто мешает создать свою таблицу с числами, "правую"? Да потому что не нужна мне таблица с которой я не собираюсь брать данные. Потому что это не подход, а фмнт ушами. Я и так знаю что можно использовать запрос с таблицы, но меня от этой мысли протсо коробит. Как же она "не нужна", если вы собрались из нее выбираит записи ? Вот точно так же как было в первом посте. Физической таблицы нет. Мне это как подход нужен. Ну не правильно это ориентироваться на количество записей в таблице. Это просто обход. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.04.2008, 09:17 |
|
Нужное количество строк без использования таблицы
|
|||
---|---|---|---|
#18+
NIIIK Вот точно так же как было в первом посте. Физической таблицы нет. Мне это как подход нужен. Ну не правильно это ориентироваться на количество записей в таблице. Это просто обход. По-моему, вы занимаетесь тофтологией. Все равно в результате действий вы получите объект, который будет занимать ресурсы. Если он заранее не занимает места в базе, значит он будет занимать больше процессорного времени при формировании и наоборот. А вы, по-моему, просто ищите метод с наименьшим программным кодом ... |
|||
:
Нравится:
Не нравится:
|
|||
29.04.2008, 10:04 |
|
Нужное количество строк без использования таблицы
|
|||
---|---|---|---|
#18+
NIIIKЯ и так знаю что можно использовать запрос с таблицы, но меня от этой мысли протсо коробит. Хм, да, в общем-то, весь язык SQL и T-SQL, в частности, созданы и заточены именно для запросов из таблиц. Вы средой разработки не ошиблись? Как это вообще терпеть, что в запросе юзается таблица, которая тебе вообще не нужна. Тем более что в ней всё равно конечное количество записей. Перемножением получать всё равно глупо. Держать таблицу и заполнять её тоже не хочу. Ну должен жи быть метод более красивый ??? Я всё ещё надеюсь что эта функия будет переписана без использования РЕЛЬНОЙ таблицы, данные с которой НЕ ИСПОЛЬЗУЮТСЯ в запросе. Вопрос ведь изначально в этом. На этом заострено внимание. Понятия красоты, глупости и т.п. сильно отличаются в разных языках. Вы точно про SQL говорите? Или Вы хотите со своим уставом в чужой монастырь залезть? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.04.2008, 10:10 |
|
Нужное количество строк без использования таблицы
|
|||
---|---|---|---|
#18+
Извиняюсь, совсем забыл что окончательное решение не выложено. Вспомнил случайно. Отдельное спасибо jap, daw и тем кот понял вопрос и дал ответы про Код: plaintext 1.
в multi-statement можно. в inline непосредственно в функции не получится. надо указывать maxrecursion в запросе из функции. Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2008, 17:23 |
|
Нужное количество строк без использования таблицы
|
|||
---|---|---|---|
#18+
На данный момент я стараюсь использовать in-line функцию и посторяю maxrecursion опцию каждый раз. Но у функций стоит "жирный" комментарий. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.09.2021, 16:49 |
|
Нужное количество строк без использования таблицы
|
|||
---|---|---|---|
#18+
NIIIK, авторберём эту дату и начинаем прибавлять к ней номер строки. Весь вопрос откуда его взять. Из таблицы чисел, разумеется. Вы же работаете с базами данных, а не с императивными языками. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.09.2021, 22:33 |
|
Нужное количество строк без использования таблицы
|
|||
---|---|---|---|
#18+
Хренасе флэшбэки через, без малого, 15 лет! :-) Я думал, эта тема до конца уже обсосана. Ну, если master..spt_values по каким то причинам брезгаете пользоваться, и длина генерируемой последовательности чем то ограничена (миллионом, миллиардом, етц.), то можно так: Код: 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.
Тем более что: SQL Server parse and compile time: CPU time = 11 ms, elapsed time = 11 ms. SQL Server Execution Times: CPU time = 0 ms, elapsed time = 0 ms. SQL Server Execution Times: CPU time = 0 ms, elapsed time = 0 ms. SQL Server Execution Times: CPU time = 0 ms, elapsed time = 0 ms. (199999 rows affected) Table 'Worktable'. Scan count 2, logical reads 1199995, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. SQL Server Execution Times: CPU time = 1032 ms, elapsed time = 1171 ms. (199999 rows affected) Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 489, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. SQL Server Execution Times: CPU time = 312 ms, elapsed time = 367 ms. Completion time: 2021-09-08T10:46:47.6679671+04:00 ... |
|||
:
Нравится:
Не нравится:
|
|||
08.09.2021, 09:47 |
|
Нужное количество строк без использования таблицы
|
|||
---|---|---|---|
#18+
uaggster Хренасе флэшбэки через, без малого, 15 лет! :-) видел на просторах инета еще такой вариант Код: sql 1. 2.
Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
08.09.2021, 10:15 |
|
|
start [/forum/topic.php?fid=46&msg=35275211&tid=1684317]: |
0ms |
get settings: |
10ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
134ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
56ms |
get tp. blocked users: |
1ms |
others: | 282ms |
total: | 518ms |
0 / 0 |