Sql server sqlserver运行计数

Sql server sqlserver运行计数,sql-server,Sql Server,将下表想象为一个 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

将下表想象为一个

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

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

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

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
--------------编辑-------------------

如果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
--------------结束编辑-------------------

注意:我重命名了表: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
或者用这样的连接

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
对此,我将使用
插入
。像这样:

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
中插入值时,此触发器都会运行,并用设置所需
等级的insert替换原始insert


例如,当您将
插入到(col1,col2,col3)值(1,2,n)
中时,实际运行的是触发器中的INSERT语句(它获取
col1
col2
col3
的原始值,但覆盖
)。

您好,感谢您的帮助。第一个代码无法工作,因为表b中没有ran列。我试了第二个。问题是,如果表B有与第一行相同的重复行,那么它也将相同的列插入到第二个条目中。它必须递增。我修改了查询以处理表B中的多个条目。您能解释一下触发器中的select子句将要检索什么吗?这将有助于我修改。感谢您的帮助。看起来这不会处理并发插入。@Robin在插入触发器中有一个名为
inserted
的表,表示插入的记录。select语句从插入的
表中选择数据,并确定下一个
,并使用此数据插入表
A
@Martin Correct,当同时插入时,您可能会得到重复的
值。唯一的修复方法是确保不发生并发插入,或者让每个插入在可序列化事务中运行(因为在
MAX
查询中选择的行上需要读锁)。不确定触发器是否是包含此类逻辑的最佳位置。