powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как пронумеровать строки резльтирующего набора?
17 сообщений из 17, страница 1 из 1
Как пронумеровать строки резльтирующего набора?
    #32034849
Alex_B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Уважаемые господа профи!
Умеет ли кто нибудь из вас так организовать запрос к БД, чтобы он возвращал не только данные но порядковые номера строк в результирующем наборе. Если умеете научите. Заранее благодарен.
...
Рейтинг: 0 / 0
Как пронумеровать строки резльтирующего набора?
    #32034850
Sanek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если примитивно то можно примерно так :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
create table #temp
(
str_no int IDENTITY( 1 , 1 ) not null,
Field1 varchar( 255 ) null,
Field2 numeric( 13 )
)

insert inTo #temp
Select Field1,Field2
  from table1
 

Select * from #temp


По утрам более умные мысли в голову не идут ... :)
...
Рейтинг: 0 / 0
Как пронумеровать строки резльтирующего набора?
    #32034852
Alex_B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Так я и сам умею. Сильно охота без временной таблицы. Очень часто приходится делать отчёты которые строятся на несложных запросах к БД. Нежелательно их усложнять до SP.
...
Рейтинг: 0 / 0
Как пронумеровать строки резльтирующего набора?
    #32034861
Dominic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А Sanek вроде бы и не SP написал... Что тебе мешает при выборке данных для отчета писать не одну команду SELECT, а пакет этих команд, образец которых Sanek и привел?
...
Рейтинг: 0 / 0
Как пронумеровать строки резльтирующего набора?
    #32034870
Sanek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А в Delphi мне кажеться так нельзя ...
там помоему SQL сильно обрезан .... так что только SP и остается ...
PS
если конечно речь про Delphi ...
...
Рейтинг: 0 / 0
Как пронумеровать строки резльтирующего набора?
    #32034872
Фотография Белов Владимир
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Sanek
и в Делфи так можно
...
Рейтинг: 0 / 0
Как пронумеровать строки резльтирующего набора?
    #32034878
Alex_B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Временные таблицы не подходят т.к. строятся они под управлением некоторого клиентского приложения, а отчёты формируются в специализированном средстве. Замусоривать базу обычными таблицами тоже не выход. Необходимо органиовывать способ их гарантарованного удаления. Кроме того много различных запросов, одновременно работает множество пользователей. Имена таблиц должны быть уникальными для каждого пользователя. При построении отчётов для разных пользователей придётся их не копировать, а стоить по новой т.к. названия таблиц разные.
...
Рейтинг: 0 / 0
Как пронумеровать строки резльтирующего набора?
    #32034880
Alex_B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В моем случае не Делфи, а CenturaTeam Developer, в общем то это не важно. В любом случае если выбирать SP или скрипт на клиете - SP лучше, т.к. при модификации проще поменять одну SP чем скажем 10 клиентских рабочих мест.
...
Рейтинг: 0 / 0
Как пронумеровать строки резльтирующего набора?
    #32034901
AnKa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Незнаю, почему " в Delphi так нельзя " - у меня все работало, но посылать с клиента запрос на n-цать строк - не лучшая манера программирования. Это сугубо мое мнение. Поэтому, для запросов более 10 строк использую SP. Я что-то не догоняю, чем тебе не нравится использование временных таблиц в SP? Запустил, отработало - получил результаты. Временные таблицы удалились. Для каждого клиента будет создана СВОЯ врем табл.- т.е. пересекаться они не будут. Кроме того, в случае чего - легко поправить логику без перекомпиляции клиентского приложения. Опять же в слечае навороченных запросов с подзапросами иногда выгоднее разбить на временные таблицы, и выбирать уже из них - уменьшается время блокирования основных таблиц.
...
Рейтинг: 0 / 0
Как пронумеровать строки резльтирующего набора?
    #32034905
Alex_B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да пожлуй из всех возможных вариант с SP и временными таблицами самый оптимальный. В то же время жаль, что нет в СУБД стандартной функции скажем RowID() Вот...
...
Рейтинг: 0 / 0
Как пронумеровать строки резльтирующего набора?
    #32034906
fima
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Способов решить эту задачу несколько.
Код: 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.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
use pubs
set nocount on
if exists (select * from sysobjects where type = 'U' and  name = 'test')
begin
	drop table test
end
 /* создание таблицы для примера */ 
create table test
(
	id_test int identity not null,
	string char ( 7 ),
	constraint pk_test primary key (id_test)
)
 /* установка флага для занесения с определенными ид. */ 
set identity_insert test on
 /* занесение тестовых значений с произвольными ид. */ 
insert into test (id_test, string)
values ( 1 ,'string1')
insert into test (id_test, string)
values ( 4 ,'string2')
insert into test (id_test, string)
values ( 12 ,'string3')
insert into test (id_test, string)
values ( 17 ,'string4')
insert into test (id_test, string)
values ( 29 ,'string5')
insert into test (id_test, string)
values ( 31 ,'string6')
insert into test (id_test, string)
values ( 42 ,'string7')
insert into test (id_test, string)
values ( 45 ,'string8')
insert into test (id_test, string)
values ( 61 ,'string9')
 /* отмена установки флага для занесения с определенными ид. */ 
set identity_insert test off
go
 /* способ №1, создание проекции. */ 
if exists (select * from sysobjects where type = 'V' and name = 'ranked_table')
begin
	drop view ranked_table
end
go
create view ranked_table (rank, id_test, sting)
as
	select (
			select count(*) 
			from test as test_2
			where test_2.id_test <= test_1.id_test
		) as rank,
		test_1.id_test,
		test_1.string
	from test as test_1
go
select * 
from ranked_table
order by rank
go
 /* способ №2 стандартный SQL */ 
select count (test_2.id_test) as rank, test_1.id_test, test_1.string
from test as test_1 inner join test as test_2 on
	test_1.id_test >= test_2.id_test
group by test_1.id_test, test_1.string
order by rank
go
 /* способ №3 стандартный SQL */ 
select test_3.rank, test_3.id_test, test_3.string
from (select test_1.id_test,
		test_1.string,
		(select count(*) 
			from test as test_2
			where test_2.id_test <= test_1.id_test
		) as rank
	from test as test_1) as test_3
order by rank
go
 /* способ №4, временная таблица с полем identity */ 
create table #rank_table
(
	rank int identity not null,
	id_test int null,
	string char ( 7 ),
	constraint pk_test primary key (rank)
)
go
insert into #rank_table (id_test, string)
select id_test, string
from test
order by id_test
select * from #rank_table
go
 /* способ №5, переменная типа table с полем identity */ 
declare @rank_table table
(
	rank int identity not null,
	id_test int null,
	string char ( 7 )
)
insert into @rank_table (id_test, string)
select id_test, string
from test
order by id_test
select * from @rank_table
go
 /* способ №6, курсор */ 
declare @rank int,
	@id_test int,
	@string char ( 7 )
declare rank_cursor cursor
for select id_test, string
	from test
	order by id_test
open rank_cursor
fetch next from rank_cursor into @id_test, @string
set @rank =  1 
while (@@fetch_status <> - 1 )
begin
	select @rank, @id_test, @string
	set @rank = @rank +  1 
	fetch next from rank_cursor into @id_test, @string
end
close rank_cursor
deallocate rank_cursor
 /* результат всех примеров
rank        id_test     string  
----------- ----------- ------- 
1           1           string1
2           4           string2
3           12          string3
4           17          string4
5           29          string5
6           31          string6
7           42          string7
8           45          string8
9           61          string9
 */ 

Соответственно нужно выбрать подходящий Вам. Обратите внимание что пример №3 входит состовляющей частью в пример №1. Поэтому на примере №2 тоже можно построить проекцию. На мой взгляд, проекция на примере №2 наиболее оптимальна, вместе с примером №5. Выбор из №2 и №5 зависит от количества данных и пр. Пример №5 будет работать только на SQL 2000. На SQL 2000 лучше использовать переменые типа table вместо временных таблиц, если это возможно. Пример №6 на мой взгляд, наиболее неудачный и я привел его для общей эрудиции. Вроде привел всё что вспомнил. Если кто знает еще способы пишите.
...
Рейтинг: 0 / 0
Как пронумеровать строки резльтирующего набора?
    #32034945
Alex_B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fima! Спасибо огромное. №2 это как раз то, что надо. Удивительно просто вышло до банальности.
...
Рейтинг: 0 / 0
Как пронумеровать строки резльтирующего набора?
    #32035071
Sanek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возвращаясь к нашим баранам остаеться последний (на мой взгляд) общий вариант такого выбора :
Код: 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.
DECLARE @FROM INT,
	@COUNT INT

SET @FROM =  10 
SET @COUNT =  10 

CREATE TABLE #TEMP 
(
Rank INTEGER IDENTITY( 1 , 1 ) ,
DDate DateTime,
NDatу float 
)

как мне кажеться такой вариант подходит под любую сортировку ... 
insert inTO #TEMP
Select t1.DDate,
       t1.NDate 
 --  inTo #Temp
 
  from NTable as T1
order by t1.DDate

SET ROWCOUNT @COUNT
Select * from #Temp
WHERE Rank > @FROM

drop table #TEMP

...
Рейтинг: 0 / 0
Как пронумеровать строки резльтирующего набора?
    #32035072
Sanek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прошу прощения не туда попал ... :)
...
Рейтинг: 0 / 0
Как пронумеровать строки резльтирующего набора?
    #32043441
Зайцев Фёдор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изменим стоку
Код: plaintext
1.
insert into test (id_test, string)
values ( 4 ,'string2')

на
Код: plaintext
1.
insert into test (id_test, string)
values ( 24 ,'string2')


Теперь сортируем по [string]
...
Рейтинг: 0 / 0
Как пронумеровать строки резльтирующего набора?
    #32043551
Фотография MiCe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
SET NOCOUNT ON
BEGIN
select identity(int, 1 , 1 ) counter ,* into #t from dbo.authors
select * from #t
drop table #t  --- ?
 
END
SET NOCOUNT OFF

можно оформить в процедуру....
правда придется формировать динамический запрос...
зато универсально...
...
Рейтинг: 0 / 0
Как пронумеровать строки резльтирующего набора?
    #32043556
Фотография MiCe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот наваял.... правда для очень уж больших данных лучше не использовать...
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
IF EXISTS (SELECT name 
	   FROM   sysobjects 
	   WHERE  name = N'addcount' 
	   AND 	  type = 'P')
    DROP PROCEDURE addcount
GO

CREATE PROCEDURE addcount 
	@sql as nvarchar( 1000 ) 
AS
SET NOCOUNT ON
EXEC(N'SELECT IDENTITY(int,1,1) counter,* INTO #t FROM (' + @sql + N') a; SELECT * FROM #t')
GO

...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как пронумеровать строки резльтирующего набора?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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