2016-08-24 24 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