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
查询中选择的行上需要读锁)。不确定触发器是否是包含此类逻辑的最佳位置。