sqlserver运行计数

时间:2011-11-11 10:34:03

标签: sql-server

想象下表为A

col1 col2 col3 rank
 1     2   n    5
 1     2   n    6
 2     3   a    3

在从表B到表A的记录下方插入时,如果插入相同的记录,则等级列值应保持递增。

表B中的记录将插入A中

col1 col2 col3
 1     2    n
 2     3    a

插入上述记录后表A中的所需输出是

 col1 col2 col3 rank
   1    2   n    5
   1    2   n    6
   1    2   n    7
   2    3   a    3
   2    3   a    4

请帮助我如何实现这一点。谢谢。

2 个答案:

答案 0 :(得分:2)

如果B中的记录是唯一的,那么您可以使用像这样的查询

--------------的修改 -------------------

如果B可以有多个记录,则可以将row_number()函数与分区

一起使用
insert into TestA
select b.*, 
(select max([rank]) from TestA where col1 = b.col1 and col2 = b.col2 and col3 = b.col3) 
+ row_number()over (partition by col1, col2, col3 order by col1, col2,col3 asc) as N
 from TestB b

-------------- END EDIT -------------------

注意:我重命名了表:TestA和TestB

insert into TestA
select b.*, (select max([rank])+1 from TestAwhere col1 = b.col1 and col2 = b.col2 and col3 = b.col3)
 from TestB b

或像这样的JOIN

insert into testa
select b.*, mr+1 from TestB b
join
(select col1, col2, col3, max([rank]) as mr
from TestA A
group by col1, col2, col3) as M
on 
b.col1 = M.col1 and b.col2 = M.col2 and b.col3 =M.col3

答案 1 :(得分:2)

我会使用INSTEAD OF INSERT trigger。像这样:

CREATE TRIGGER rankInsertTrigger
ON A
INSTEAD OF INSERT
AS
BEGIN
    INSERT INTO A(col1, col2, col3, rank)
    SELECT i.col1, i.col2, i.col3,
           MAX(SELECT a.rank
               FROM A AS a
               WHERE a.col1 = i.col1
                 AND a.col2 = i.col2
                 AND a.col3 = i.col3) + 1
    FROM inserted i
END

每次您现在将值插入表A时,此触发器将运行并使用插入替换原始插入,该插入设置您想要的rank

例如,当您执行INSERT INTO A(col1, col2, col3) VALUES (1, 2, n)时,实际运行的是触发器中的insert语句(它采用col1col2col3的原始值但是覆盖rank)。