Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как избавиться откурсора в запросе?  [new]
Umka
Member

Откуда:
Сообщений: 87
Можно ли сделать как-нибудь следующий запрос без курсоров?

DECLARE @ID1 [uniqueidentifier], @ID2 [uniqueidentifier]

DECLARE AreaHiearchyCursor CURSOR FOR
WITH cteup AS(
	SELECT
		AC.[CONTAINED_AREA],
		AC.[CONTAINING_AREA],
		0 AS lvl
	FROM AREA_CONTAIN AC
	WHERE AC.[CONTAINED_AREA] = @p_ContainedAreaId
	UNION ALL
	SELECT
        AC.[CONTAINED_AREA],
		AC.[CONTAINING_AREA],
		[cteup].[lvl] + 1 AS lvl
	FROM AREA_CONTAIN AC
		JOIN [cteup] ON AC.[CONTAINED_AREA] = [cteup].[CONTAINING_AREA]
)
SELECT [CONTAINING_AREA], [CONTAINED_AREA]
FROM cteup
ORDER BY [cteup].[lvl] DESC


CREATE TABLE #AreaIdsTable (ID [uniqueidentifier])
OPEN AreaHiearchyCursor;

FETCH NEXT FROM AreaHiearchyCursor INTO @ID1, @ID2

WHILE @@FETCH_STATUS = 0
BEGIN
    INSERT INTO #AreaIdsTable (ID) values (@ID1)
    INSERT INTO #AreaIdsTable (ID) values (@ID2)
    
    FETCH NEXT FROM AreaHiearchyCursor INTO @ID1, @ID2
END;

select AREA_ID, AREA, AREA_TYPE FROM AREA WHERE AREA_ID in (select ID FROM #AreaIdsTable)

drop table #AreaIdsTable;
CLOSE AreaHiearchyCursor;
DEALLOCATE AreaHiearchyCursor;
14 авг 09, 18:38    [7541367]     Ответить | Цитировать Сообщить модератору
 Re: Как избавиться откурсора в запросе?  [new]
Umka
Member

Откуда:
Сообщений: 87
Забыл сказать, что CTE запрос дает результат следующего вида


1, 2
2, 3,
3, 4

получается что мне нужно, какнибудь развернуть результат запроса в список типа

1
2
3
4

Как это сделать?
14 авг 09, 18:40    [7541377]     Ответить | Цитировать Сообщить модератору
 Re: Как избавиться откурсора в запросе?  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
...
INSERT INTO #AreaIdsTable (ID)
SELECT [CONTAINING_AREA]
FROM cteup
UNION ALL
SELECT [CONTAINED_AREA]
FROM cteup
...
?
14 авг 09, 18:43    [7541387]     Ответить | Цитировать Сообщить модератору
 Re: Как избавиться откурсора в запросе?  [new]
iljy
Member

Откуда:
Сообщений: 8711
Umka,

UNPIVOT
14 авг 09, 18:44    [7541390]     Ответить | Цитировать Сообщить модератору
 Re: Как избавиться откурсора в запросе?  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
WITH cteup AS(
	SELECT
		AC.[CONTAINED_AREA],
		AC.[CONTAINING_AREA],
		0 AS lvl
	FROM AREA_CONTAIN AC
	WHERE AC.[CONTAINED_AREA] = @p_ContainedAreaId
	UNION ALL
	SELECT
        AC.[CONTAINED_AREA],
		AC.[CONTAINING_AREA],
		[cteup].[lvl] + 1 AS lvl
	FROM AREA_CONTAIN AC
		JOIN [cteup] ON AC.[CONTAINED_AREA] = [cteup].[CONTAINING_AREA]
)
SELECT A.AREA_ID, A.AREA, AREA_TYPE
FROM AREA A
WHERE A.AREA_ID IN(SELECT [CONTAINING_AREA] FROM cteup UNION ALL SELECT @p_ContainedAreaId);
??

Не проверял!
14 авг 09, 18:49    [7541403]     Ответить | Цитировать Сообщить модератору
 Re: Как избавиться откурсора в запросе?  [new]
Umka
Member

Откуда:
Сообщений: 87
2iap - работает, только порядок получается не правильный

2iljy - c UNPIVOT тоже работает, только приходится табличку в памяти создавать, что бы сделать UNIPIVOT без нее неполучается.
14 авг 09, 20:27    [7541664]     Ответить | Цитировать Сообщить модератору
 Re: Как избавиться откурсора в запросе?  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Umka
2iap - работает, только порядок получается не правильный

2iljy - c UNPIVOT тоже работает, только приходится табличку в памяти создавать, что бы сделать UNIPIVOT без нее неполучается.
А где в первом сообщении темы какой-нибудь порядок?
14 авг 09, 20:37    [7541677]     Ответить | Цитировать Сообщить модератору
 Re: Как избавиться откурсора в запросе?  [new]
iljy
Member

Откуда:
Сообщений: 8711
Umka
2iap - работает, только порядок получается не правильный

2iljy - c UNPIVOT тоже работает, только приходится табличку в памяти создавать, что бы сделать UNIPIVOT без нее неполучается.


в смысле - в памяти? временную? а зачем? почему так нельзя?

select AREA_ID, AREA, AREA_TYPE
FROM AREA t1 join
(
   ваша выборка с UNPIVOT
) t2
   on t1.AREA_ID = t2.ID
14 авг 09, 20:38    [7541679]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить