powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Нужное количество строк без использования таблицы
25 сообщений из 59, страница 1 из 3
Нужное количество строк без использования таблицы
    #35275035
NIIIK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем доброго времени суток ! :)

Уже голову сломал с тревиальнейшей задачей :(
Всё началось с задачи, когда мне в зависимости от какого-то числа (переменой или значения в таблицах) необходимо выбрать количество строк. Вот отвлечённый (не тот для которого мне нужно решение) пример.
Есть начальная дата и нам надо от неё построить таблицу чисел на 400 дней. Что может быть проще ?! берём эту дату и начинаем прибавлять к ней номер строки. Весь вопрос откуда его взять.
Есть топорный метод, когда делается выборка из таблицы с заранее не меньшим количеством строк (либо она получается перемножением), выводится нормер строки, а потом ставится условие на следующем уровне запроса. Но этот метод не наш !

В некоторых хороших СУБД можно напиать так
Код: plaintext
1.
select level from dual connect by  level <  400 

и будет счастье.

В Ms SQL Server 2005 есть понятие если не иерархического, то рекурсивного запроса, где при помощи ловкости рук можно построить иерархию. Вот и воспользуемся мы этим CTE

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
WITH derevo (
            level
            ) AS
      (
      select  1  as level

      union all

      select d.level +  1 
        from derevo d
        where d.level <  99 

      )
      select 
             d.level
        from derevo d

Но у нас возникает проблемка, когда уровень РЕКУРСИИ, по которой определяется уровень ИЕРАРХИИ становится больше 100. Сразу скажу что мне этого мало. А очередное перемножение с row_number() - это не дело.

Как обойти эту проблему или как убрать ограничение на уровень рекурсии ???
Поиском пользовался. Толком ничего не нашёл к сожалению :(
Буду благодарен за помощь.
...
Рейтинг: 0 / 0
Нужное количество строк без использования таблицы
    #35275045
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NIIIKВсем доброго времени суток ! :)

Уже голову сломал с тревиальнейшей задачей :(
Всё началось с задачи, когда мне в зависимости от какого-то числа (переменой или значения в таблицах) необходимо выбрать количество строк. Вот отвлечённый (не тот для которого мне нужно решение) пример.
Есть начальная дата и нам надо от неё построить таблицу чисел на 400 дней. Что может быть проще ?! берём эту дату и начинаем прибавлять к ней номер строки. Весь вопрос откуда его взять.
Есть топорный метод, когда делается выборка из таблицы с заранее не меньшим количеством строк (либо она получается перемножением), выводится нормер строки, а потом ставится условие на следующем уровне запроса. Но этот метод не наш !

В некоторых хороших СУБД можно напиать так
Код: plaintext
1.
select level from dual connect by  level <  400 

и будет счастье.

В Ms SQL Server 2005 есть понятие если не иерархического, то рекурсивного запроса, где при помощи ловкости рук можно построить иерархию. Вот и воспользуемся мы этим CTE

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
WITH derevo (
            level
            ) AS
      (
      select  1  as level

      union all

      select d.level +  1 
        from derevo d
        where d.level <  99 

      )
      select 
             d.level
        from derevo d

Но у нас возникает проблемка, когда уровень РЕКУРСИИ, по которой определяется уровень ИЕРАРХИИ становится больше 100. Сразу скажу что мне этого мало. А очередное перемножение с row_number() - это не дело.

Как обойти эту проблему или как убрать ограничение на уровень рекурсии ???
Поиском пользовался. Толком ничего не нашёл к сожалению :(
Буду благодарен за помощь.
Код: plaintext
OPTION(MAXRECURSION  0 )
...
Рейтинг: 0 / 0
Нужное количество строк без использования таблицы
    #35275046
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NIIIK
Но у нас возникает проблемка, когда уровень РЕКУРСИИ, по которой определяется уровень ИЕРАРХИИ становится больше 100.

И какая же это проблемка ?
...
Рейтинг: 0 / 0
Нужное количество строк без использования таблицы
    #35275096
NIIIK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо за столь быстрый ответ !
И что я не подумал что про CT в БОЛ можно почитать :(
...
Рейтинг: 0 / 0
Нужное количество строк без использования таблицы
    #35275140
NIIIK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не получается

Код: plaintext
OPTION(MAXRECURSION  0 )

Использовать в табличной функции.
...
Рейтинг: 0 / 0
Нужное количество строк без использования таблицы
    #35275183
NIIIK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Извеняюсь, в неоторых надо писать
Код: plaintext
1.
2.
3.
4.
5.
select t.fn_level
  from (select level as fn_level 
          from dual
        connect by level <=  1000 ) t

...
Рейтинг: 0 / 0
Нужное количество строк без использования таблицы
    #35275208
Фотография daw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Не получается
>OPTION(MAXRECURSION 0)
>Использовать в табличной функции.

в multi-statement можно. в inline непосредственно в функции не получится. надо
указывать maxrecursion в запросе из функции.

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Нужное количество строк без использования таблицы
    #35275211
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NIIIKНе получается

Код: plaintext
OPTION(MAXRECURSION  0 )

Использовать в табличной функции.Внутри inline функции и view действительно нельзя. А в multistatement function - можно. Если нельзя внутри, то всё равно можно - в SELECTе из этих объектов. Неудобно, конечно
...
Рейтинг: 0 / 0
Нужное количество строк без использования таблицы
    #35275272
pkarklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторSELECT TOP 400
number
FROM
master..spt_values
WHERE
type = 'P'

Там таких записей 2048. Большее число - получается декартовым произведением. Наконец в некоторых хорошихъ базах данных всегда присутсвет табличка Number с числоми от ... и до...
...
Рейтинг: 0 / 0
Нужное количество строк без использования таблицы
    #35279409
NIIIK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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) не хочу писать ни этот кусок запроса везде где мне нужна подобная конструкция, ни объявлять таблицчную переменную потом инсёртить в неё данные (что работает так же только в процедурах)
...
Рейтинг: 0 / 0
Нужное количество строк без использования таблицы
    #35279552
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не понимаю, а почему Вы не можете использовать конструкцию
Код: plaintext
SELECT TOP(Expression) * FROM ...
если надо выбрать рассчитанное количество строк из таблицы? Причем Expression - это в частном случае может быть даже подзапрос!
...
Рейтинг: 0 / 0
Нужное количество строк без использования таблицы
    #35279557
pkarklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторпо моему вас не понятен вопрос.
1) вы предлагаете изначально кривой метод;

Да что Вы говорите?!

автор2) вы не можете управлять количаством строк через TOP, а можете изначально выбрать много записей, а потом поставить where ПОЛЕ < @Переменная, что так же кривой метод.

Не знаю как Вы, я могу:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
DECLARE @N int

SET @N =  100 

SELECT TOP (@N)
  number
FROM 
  master..spt_values 
WHERE
  type = 'P'

Более того, с таким поздапросом (постоянной таблицей Number) обычно JOINятся по условию

Код: plaintext
1.
...
Number <= @var

авторНужна именно табличная функция, потому что:
1) используется в других функциях
2) не хочу писать ни этот кусок запроса везде где мне нужна подобная конструкция, ни объявлять таблицчную переменную потом инсёртить в неё данные (что работает так же только в процедурах)

Да ради бога, уже давно пора было написать, использовав за основу приведенный мною запрос.
...
Рейтинг: 0 / 0
Нужное количество строк без использования таблицы
    #35279561
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NIIIK

Нужна именно табличная функция, потому что:
1) используется в других функциях
2) не хочу писать ни этот кусок запроса везде где мне нужна подобная конструкция, ни объявлять таблицчную переменную потом инсёртить в неё данные (что работает так же только в процедурах)
И что мешает в функции в цикле добавить в табличную переменную нужное число записей ?
...
Рейтинг: 0 / 0
Нужное количество строк без использования таблицы
    #35279988
NIIIK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot pkarklin]

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
DECLARE @N int

SET @N =  100 

SELECT TOP (@N)
  number
FROM 
  master..spt_values 
WHERE
  type = 'P'

Извеняюсь. Хе, действительно синтаксис хрен угадаешь хоть и аналогичен exec (@SQL).
Но выбирать из левой таблицы надеюсь всё равно не прийдётся.
...
Рейтинг: 0 / 0
Нужное количество строк без использования таблицы
    #35280078
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NIIIK[quot pkarklin]

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
DECLARE @N int

SET @N =  100 

SELECT TOP (@N)
  number
FROM 
  master..spt_values 
WHERE
  type = 'P'

Извеняюсь. Хе, действительно синтаксис хрен угадаешь хоть и аналогичен exec (@SQL).
Но выбирать из левой таблицы надеюсь всё равно не прийдётся.Под "левой" таблицей имеется в виду master..spt_values ? А кто мешает создать свою таблицу с числами, "правую"?
...
Рейтинг: 0 / 0
Нужное количество строк без использования таблицы
    #35284171
NIIIK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iapПод "левой" таблицей имеется в виду master..spt_values ? А кто мешает создать свою таблицу с числами, "правую"?

Да потому что не нужна мне таблица с которой я не собираюсь брать данные. Потому что это не подход, а фмнт ушами. Я и так знаю что можно использовать запрос с таблицы, но меня от этой мысли протсо коробит. Как это вообще терпеть, что в запросе юзается таблица, которая тебе вообще не нужна. Тем более что в ней всё равно конечное количество записей. Перемножением получать всё равно глупо. Держать таблицу и заполнять её тоже не хочу. Ну должен жи быть метод более красивый ??? Я всё ещё надеюсь что эта функия будет переписана без использования РЕЛЬНОЙ таблицы, данные с которой НЕ ИСПОЛЬЗУЮТСЯ в запросе. Вопрос ведь изначально в этом. На этом заострено внимание.
...
Рейтинг: 0 / 0
Нужное количество строк без использования таблицы
    #35284175
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NIIIK iapПод "левой" таблицей имеется в виду master..spt_values ? А кто мешает создать свою таблицу с числами, "правую"?

Да потому что не нужна мне таблица с которой я не собираюсь брать данные. Потому что это не подход, а фмнт ушами. Я и так знаю что можно использовать запрос с таблицы, но меня от этой мысли протсо коробит.
Как же она "не нужна", если вы собрались из нее выбираит записи ?
...
Рейтинг: 0 / 0
Нужное количество строк без использования таблицы
    #35284812
NIIIK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Glory NIIIK iapПод "левой" таблицей имеется в виду master..spt_values ? А кто мешает создать свою таблицу с числами, "правую"?

Да потому что не нужна мне таблица с которой я не собираюсь брать данные. Потому что это не подход, а фмнт ушами. Я и так знаю что можно использовать запрос с таблицы, но меня от этой мысли протсо коробит.
Как же она "не нужна", если вы собрались из нее выбираит записи ?

Вот точно так же как было в первом посте. Физической таблицы нет. Мне это как подход нужен. Ну не правильно это ориентироваться на количество записей в таблице. Это просто обход.
...
Рейтинг: 0 / 0
Нужное количество строк без использования таблицы
    #35284898
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NIIIK
Вот точно так же как было в первом посте. Физической таблицы нет. Мне это как подход нужен. Ну не правильно это ориентироваться на количество записей в таблице. Это просто обход.
По-моему, вы занимаетесь тофтологией. Все равно в результате действий вы получите объект, который будет занимать ресурсы. Если он заранее не занимает места в базе, значит он будет занимать больше процессорного времени при формировании и наоборот. А вы, по-моему, просто ищите метод с наименьшим программным кодом
...
Рейтинг: 0 / 0
Нужное количество строк без использования таблицы
    #35284917
NIIIKЯ и так знаю что можно использовать запрос с таблицы, но меня от этой мысли протсо коробит.
Хм, да, в общем-то, весь язык SQL и T-SQL, в частности, созданы и заточены именно для запросов из таблиц. Вы средой разработки не ошиблись?
Как это вообще терпеть, что в запросе юзается таблица, которая тебе вообще не нужна. Тем более что в ней всё равно конечное количество записей. Перемножением получать всё равно глупо. Держать таблицу и заполнять её тоже не хочу. Ну должен жи быть метод более красивый ??? Я всё ещё надеюсь что эта функия будет переписана без использования РЕЛЬНОЙ таблицы, данные с которой НЕ ИСПОЛЬЗУЮТСЯ в запросе. Вопрос ведь изначально в этом. На этом заострено внимание.
Понятия красоты, глупости и т.п. сильно отличаются в разных языках. Вы точно про SQL говорите? Или Вы хотите со своим уставом в чужой монастырь залезть?
...
Рейтинг: 0 / 0
Нужное количество строк без использования таблицы
    #35307167
NIIIK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Извиняюсь, совсем забыл что окончательное решение не выложено. Вспомнил случайно.
Отдельное спасибо jap, daw и тем кот понял вопрос и дал ответы про

Код: plaintext
1.
OPTION(MAXRECURSION  0 )


в 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.
create function get_sequence
(
	@pMaxOrder integer
)
returns 
@Result table 
(
	level integer
)
AS
BEGIN
   
	with derevo
         (
            level
         ) AS
         (
          select  1  as level
          union all
          select d.level +  1 
            from derevo d
           where d.level < @pMaxOrder
         )
		 insert 
           into @Result
         select d.level
           from derevo d OPTION (MAXRECURSION  0 )	
	return 
end
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Нужное количество строк без использования таблицы
    #40095784
NIIIK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На данный момент я стараюсь использовать in-line функцию и посторяю maxrecursion опцию каждый раз.
Но у функций стоит "жирный" комментарий.
...
Рейтинг: 0 / 0
Нужное количество строк без использования таблицы
    #40095845
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NIIIK,

авторберём эту дату и начинаем прибавлять к ней номер строки. Весь вопрос откуда его взять.
Из таблицы чисел, разумеется. Вы же работаете с базами данных, а не с императивными языками.
...
Рейтинг: 0 / 0
Нужное количество строк без использования таблицы
    #40095872
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хренасе флэшбэки через, без малого, 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.
Set statistics time on;
Set statistics io on;

Declare @n int = 199999

;WITH derevo (
            level
            ) AS
      (
      select 0 as level

      union all

      select d.level + 1
        from derevo d
        where d.level < @n-1

      )
      select 
             d.level
        from derevo d
Option(maxrecursion 0)

;With a as (
Select t.n from (values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) t(n)
)
Select top(@n)
a0.n + isNull(a1.n,0)*10 + isNull(a2.n,0)*100 + isNull(a3.n,0)*1000 + isNull(a4.n,0)*10000 + isNull(a5.n,0)*100000 N
from a a0
cross join a a1
cross join a a2
cross join a a3
cross join a a4
cross join a a5
Order by 1 ASC


Тем более что:

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
...
Рейтинг: 0 / 0
Нужное количество строк без использования таблицы
    #40095881
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uaggster
Хренасе флэшбэки через, без малого, 15 лет!
:-)

видел на просторах инета еще такой вариант
Код: sql
1.
2.
select row_number() over (order by (select 1/0)) n
from string_split(REPLICATE(cast(' ' as varchar(max)), @n-1), ' ') x



Код: 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.
Время синтаксического анализа и компиляции SQL Server: 
 время ЦП = 12 мс, истекшее время = 12 мс.

 Время работы SQL Server:
   Время ЦП = 0 мс, затраченное время = 0 мс.

 Время работы SQL Server:
   Время ЦП = 0 мс, затраченное время = 0 мс.

 Время работы SQL Server:
   Время ЦП = 0 мс, затраченное время = 0 мс.

(199999 rows affected)
Таблица "Worktable". Число просмотров 2, логических чтений 1199995, физических чтений 0, упреждающих чтений 0, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.

 Время работы SQL Server:
   Время ЦП = 1141 мс, затраченное время = 1248 мс.

(199999 rows affected)
Таблица "Worktable". Число просмотров 0, логических чтений 0, физических чтений 0, упреждающих чтений 857, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.

 Время работы SQL Server:
   Время ЦП = 485 мс, затраченное время = 150 мс.

(199999 rows affected)

 Время работы SQL Server:
   Время ЦП = 172 мс, затраченное время = 188 мс.
...
Рейтинг: 0 / 0
25 сообщений из 59, страница 1 из 3
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Нужное количество строк без использования таблицы
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]