Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как пронумеровать строки резльтирующего набора? / 17 сообщений из 17, страница 1 из 1
03.07.2002, 08:52:39
    #32034849
Alex_B
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как пронумеровать строки резльтирующего набора?
Уважаемые господа профи!
Умеет ли кто нибудь из вас так организовать запрос к БД, чтобы он возвращал не только данные но порядковые номера строк в результирующем наборе. Если умеете научите. Заранее благодарен.
...
Рейтинг: 0 / 0
03.07.2002, 09:05:47
    #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
03.07.2002, 09:11:51
    #32034852
Alex_B
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как пронумеровать строки резльтирующего набора?
Так я и сам умею. Сильно охота без временной таблицы. Очень часто приходится делать отчёты которые строятся на несложных запросах к БД. Нежелательно их усложнять до SP.
...
Рейтинг: 0 / 0
03.07.2002, 09:47:50
    #32034861
Dominic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как пронумеровать строки резльтирующего набора?
А Sanek вроде бы и не SP написал... Что тебе мешает при выборке данных для отчета писать не одну команду SELECT, а пакет этих команд, образец которых Sanek и привел?
...
Рейтинг: 0 / 0
03.07.2002, 10:22:34
    #32034870
Sanek
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как пронумеровать строки резльтирующего набора?
А в Delphi мне кажеться так нельзя ...
там помоему SQL сильно обрезан .... так что только SP и остается ...
PS
если конечно речь про Delphi ...
...
Рейтинг: 0 / 0
03.07.2002, 10:23:54
    #32034872
Белов Владимир
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как пронумеровать строки резльтирующего набора?
>Sanek
и в Делфи так можно
...
Рейтинг: 0 / 0
03.07.2002, 10:34:41
    #32034878
Alex_B
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как пронумеровать строки резльтирующего набора?
Временные таблицы не подходят т.к. строятся они под управлением некоторого клиентского приложения, а отчёты формируются в специализированном средстве. Замусоривать базу обычными таблицами тоже не выход. Необходимо органиовывать способ их гарантарованного удаления. Кроме того много различных запросов, одновременно работает множество пользователей. Имена таблиц должны быть уникальными для каждого пользователя. При построении отчётов для разных пользователей придётся их не копировать, а стоить по новой т.к. названия таблиц разные.
...
Рейтинг: 0 / 0
03.07.2002, 10:39:32
    #32034880
Alex_B
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как пронумеровать строки резльтирующего набора?
В моем случае не Делфи, а CenturaTeam Developer, в общем то это не важно. В любом случае если выбирать SP или скрипт на клиете - SP лучше, т.к. при модификации проще поменять одну SP чем скажем 10 клиентских рабочих мест.
...
Рейтинг: 0 / 0
03.07.2002, 11:49:55
    #32034901
AnKa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как пронумеровать строки резльтирующего набора?
Незнаю, почему " в Delphi так нельзя " - у меня все работало, но посылать с клиента запрос на n-цать строк - не лучшая манера программирования. Это сугубо мое мнение. Поэтому, для запросов более 10 строк использую SP. Я что-то не догоняю, чем тебе не нравится использование временных таблиц в SP? Запустил, отработало - получил результаты. Временные таблицы удалились. Для каждого клиента будет создана СВОЯ врем табл.- т.е. пересекаться они не будут. Кроме того, в случае чего - легко поправить логику без перекомпиляции клиентского приложения. Опять же в слечае навороченных запросов с подзапросами иногда выгоднее разбить на временные таблицы, и выбирать уже из них - уменьшается время блокирования основных таблиц.
...
Рейтинг: 0 / 0
03.07.2002, 12:14:43
    #32034905
Alex_B
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как пронумеровать строки резльтирующего набора?
Да пожлуй из всех возможных вариант с SP и временными таблицами самый оптимальный. В то же время жаль, что нет в СУБД стандартной функции скажем RowID() Вот...
...
Рейтинг: 0 / 0
03.07.2002, 12:19:02
    #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
03.07.2002, 14:31:28
    #32034945
Alex_B
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как пронумеровать строки резльтирующего набора?
fima! Спасибо огромное. №2 это как раз то, что надо. Удивительно просто вышло до банальности.
...
Рейтинг: 0 / 0
04.07.2002, 09:24:31
    #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
04.07.2002, 09:25:27
    #32035072
Sanek
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как пронумеровать строки резльтирующего набора?
Прошу прощения не туда попал ... :)
...
Рейтинг: 0 / 0
15.08.2002, 10:58:56
    #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
15.08.2002, 14:22:43
    #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
15.08.2002, 14:36:15
    #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
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как пронумеровать строки резльтирующего набора? / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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