2016-08-24 22 views
1

我有一個這樣的表,只用我已經順利更新它更新與序列號一欄沒有在SQL Server中使用ROW_NUMBER()

code descd slnum 
--------------------- 
10  a  0 
10  b  0 
12  c  0 
12  d  0 
11  e  0 
12  f  0 

我要更新這個表像這樣不使用ROW_NUMBER()如果其他循環,我該怎麼做?

code descd slnum 
---------------------- 
10  a  1 
10  b  2 
12  c  1 
12  d  2 
11  e  1 
12  f  3 
+0

添加DBMS標籤 – Jens

+0

1.爲什麼不使用'ROW_NUMBER()',它是一個功課? 2.如果else是一個不是'loop'的條件。 3你想用'While'循環或'Cursor'來獲得答案嗎? (表現不佳) –

回答

1

對於SQL 2012+

;WITH rownum(code, descd, slnum) AS (
    SELECT 10, 'a', 0 
    UNION SELECT 10, 'b', 0 
    UNION SELECT 12, 'c', 0 
    UNION SELECT 12, 'd', 0 
    UNION SELECT 11, 'e', 0 
    UNION SELECT 12, 'f', 0 
    ) SELECT code, descd, COUNT(*) OVER (PARTITION BY code ORDER BY code   
    ROWS UNBOUNDED PRECEDING) FROM rownum o ORDER BY descd 
0

嘗試此

DECLARE @Tbl TABLE(code VARCHAR(5), descd VARCHAR(5), slnum int) 
INSERT INTO @Tbl 
(code, descd) 
VALUES 
('10',  'a'),  
('10',  'b'),  
('12',  'c'),  
('12',  'd'),  
('11',  'e'),  
('12',  'f')  


DECLARE @TempTable TABLE(code VARCHAR(5), descd VARCHAR(5), RowId int) 
DECLARE @RowId INT = 1 

WHILE @RowId <= (SELECT COUNT(*) FROM @Tbl) 
BEGIN 

    INSERT INTO @TempTable 
    SELECT TOP 1 
     T.code , 
     T.descd , 
     @RowId  
    FROM 
     @Tbl T LEFT JOIN 
     @TempTable L ON L.code = T.code AND L.descd = T.descd 
    WHERE 
     L.code IS null 
    ORDER BY 
     T.code, 
     T.descd 

    UPDATE @Tbl 
    SET slnum = (SELECT COUNT(1) FROM @TempTable A WHERE [@Tbl].Code = A.Code) 
    WHERE 
     [@Tbl].Code = (SELECT TOP 1 Y.code FROM @TempTable Y WHERE RowId = @RowId) AND 
     [@Tbl].descd = (SELECT TOP 1 Y.descd FROM @TempTable Y WHERE RowId = @RowId) 


    SET @RowId += 1  
END 

SELECT * from @Tbl 

結果:

code descd slnum 
10  a  1 
10  b  2 
12  c  1 
12  d  2 
11  e  1 
12  f  3 
0

; WITH ROWNUM(代碼,descd,slnum)AS( SELECT 10,'a',0 UNION SELECT 10,'b',0 UNION SELECT 12,'c',0 UNION SELECT 12,'d',0 UNION SELECT 11,'e',0 UNION SELECT 12,'f',0 )選擇代碼,descd,COUNT(*)OVER(PARTITION BY代碼ORDER BY代碼
)FROM ROWNUM ORDER BY descd