想象下表为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
请帮助我如何实现这一点。谢谢。
答案 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语句(它采用col1
,col2
,col3
的原始值但是覆盖rank
)。