![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Функции агрегирования для строк в SQL
Wild © (2002-05-23 16:22:00)такая фигня
есть две таблицы
T1
=====
ID
....
и
T2
====
ID
T1_ID
Value
Мне, например, надо узнать какие T2.Value относятся к каждой записи в T1
select T1.ID, T2.Value from T1,T2 where T2.T1_ID=T1.ID
Ну он мне типа выдаст:
ID Value
==== ========
1 1
1 2
1 3
2 1
2 2
3 3
А вот можно вот что бы так:
ID Value
==== ========
1 1,2,3
2 1,2
3 3
sniknik (2002-05-23 18:42:00) [1]аналог для MSSQL
CREATE function GetStr (@id int)
RETURNS varchar (8000)
AS
BEGIN
DECLARE @Ret varchar (8000)
DECLARE @S varchar (8000)
DECLARE CountCur CURSOR FOR
SELECT CAST(PRICERUB AS varchar (8)) FROM CASHSAIL WHERE [Id] = @id
OPEN CountCur
FETCH NEXT FROM CountCur INTO @Ret
WHILE @@FETCH_STATUS = 0
BEGIN
FETCH NEXT FROM CountCur INTO @S
SET @Ret= @Ret + "," + @S
END
CLOSE CountCur
DEALLOCATE CountCur
RETURN @Ret
END
select [id], dbo.GetStr([id]) from cashsail
order by [id]
xGrey (2002-05-23 17:55:00) [2]Для Oracle - рбочая, проверял. Там так можно организовать курсорный цикл и неявно инициализировать переменную курсорного цикла.
Johnmen (2002-05-23 17:46:00) [3]>xGrey ©
Ты уверен, что конструкция рабочая ?
for r in (select value from t2 where t2.T1_ID=inT1_id)
я бы сначала проверил... :)
Johnmen (2002-05-23 17:41:00) [4]А вот так чтобы так - НЕЛЬЗЯ...
xGrey (2002-05-23 17:40:00) [5]Если я правильно понял вопрос, то то,что Вы назаваете "ф-цией агрегирования строк" придется писать самому. Примерный вариант на Oracle:
function GetStr(inT1_id in integer) return varchar2 as
s varchar2(10000);
begin
for r in
(select value from t2 where t2.T1_ID=inT1_id)
loop
s:=s||to_char(r.value)||",";
end loop;
return s;
end;
Вызов:
select t1.id, GetStr(t1.ID) from t1
order by t1.id