-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