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

Откуда:
Сообщений: 5
Есть таблица #Operations, содержащая список временных интервалов (ID,START_TIME,STOP_TIME).
И другая таблица - #Cross, содержащая "пересечения" интервалов из таблица #Operations (ID1, BT1, ET1, ID2, BT2, ET2).
Необходимо объединить пересекающиеся интервалы в #Operations.
Сейчас это происходит таким образом:
DECLARE cr_Cross CURSOR LOCAL FORWARD_ONLY FOR 
		SELECT * FROM #Cross 
	OPEN cr_Cross 
	FETCH NEXT FROM cr_Cross INTO @ID1, @BT1, @ET1, @ATM_ID1, @ID2, @BT2, @ET2, @ATM_ID2 
	WHILE @@FETCH_STATUS = 0 BEGIN 
		-- Объединяем интервалы, корректируем первую запись, и удаляем вторую 
		IF @BT2 < @BT1 SET @BT1=@BT2 
		IF @ET2 > @ET1 SET @ET1=@ET2 
		UPDATE #Operations SET  
			START_TIME=@BT1 
			,STOP_TIME=@ET1  
			WHERE [ID]=@ID1 
		DELETE #Operations WHERE [ID]=@ID2 
		FETCH NEXT FROM cr_Cross INTO @ID1, @BT1, @ET1, @ATM_ID1, @ID2, @BT2, @ET2, @ATM_ID2 
	END 

	CLOSE cr_Cross 
	DEALLOCATE cr_Cross 
Вопрос: можно ли избежать использования курсора и если да, то как?
7 июн 11, 11:35    [10775386]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли обойтись без курсора  [new]
Guf
Member

Откуда: Новосибирск
Сообщений: 659
UPDATE o
    SET START_TIME=(CASE
                        WHEN @BT2 < @BT1 THEN @BT2 
                        ELSE @BT1
                    END)
	   ,STOP_TIME=(CASE
                        WHEN @ET2 < @ET1 THEN @ET2 
                        ELSE @ET1
                    END)
    FROM #Operations o
         INNER JOIN #Cross c ON c.ID1 = o.ID

DELETE o
    FROM #Operations o
         INNER JOIN #Cross c ON c.ID2 = o.ID
7 июн 11, 13:14    [10776304]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли обойтись без курсора  [new]
Fenrir1
Member

Откуда:
Сообщений: 5
Спасибо, попробую.
7 июн 11, 13:53    [10776598]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить