-1
我怎樣才能做到這一點沒有光標:替代這個遊標SQL
SET NOCOUNT ON;
DECLARE @VAR_A BIGINT, @VAR_B TINYINT;
DECLARE _CURSOR CURSOR FOR
SELECT A, B FROM MY_TABLE
OPEN _CURSOR
FETCH NEXT FROM _CURSOR
INTO @VAR_A, @VAR_B
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT TOP 2 A, B, C, ROW_NUMBER() OVER (ORDER BY A DESC) AS ROW_NUM
INTO #TMP FROM MY_TABLE_2
WHERE A = @VAR_A AND X = 0 ORDER BY A DESC
IF ((SELECT COUNT(*) FROM #TMP) = 1) BEGIN
UPDATE MY_TABLE
SET Y = (SELECT B FROM #TMP WHERE ROW_NUM = 1)
WHERE A = @VAR_A
END ELSE IF (@VAR_B = 7) BEGIN
UPDATE MY_TABLE
SET Y = (SELECT B FROM #TMP WHERE ROW_NUM = 2),
Z = (SELECT C FROM #TMP WHERE ROW_NUM = 2)
WHERE A = @VAR_A
END ELSE BEGIN
UPDATE MY_TABLE
SET Y = (SELECT B FROM #TMP WHERE ROW_NUM = 2)
WHERE A = @VAR_A
END
DROP TABLE #TMP
FETCH NEXT FROM _CURSOR
INTO @VAR_A, @VAR_B
END
CLOSE _CURSOR;
DEALLOCATE _CURSOR;
我有一個產品表,這個表有一個狀態欄,該產品的最新狀態。我有另一張表,即PRODUCT_HISTORY,其中包含產品更改的所有信息,包括舊的狀態。對於每種產品,我需要獲得最後的狀態並將其插入產品表上的新字段。就像這樣:
而是希望我們解剖這個光標去了解它的意圖,爲什麼不解釋它做了什麼以及你試圖用這個光標來回答你的整體問題是什麼?由於它是自引用的,因此可能會自行加入......也會明智地標記各自的RDMS(版本)。 – scsimon
我有一個PRODUCT表,該表具有狀態列,即產品的最後一個狀態。我有另一張表,即PRODUCT_HISTORY,其中包含產品更改的所有信息,包括舊的狀態。對於每種產品,我需要獲得最後的狀態並將其插入產品表上的新字段。 –
然後不,你不需要光標。然而,樣本數據和預期的輸出在這裏是需要的... – scsimon