根据另一个表中的值插入和/或更新记录

时间:2020-07-31 22:23:10

标签: sql sql-server sql-update sql-insert window-functions

基本上,如果CANID在targettable中作为重复项存在,我想做的就是在sourcetable中创建一个新的重复项行。例如,在此集合中,CANID'2'作为副本存在于targettable中,但在源表中仅存在一次。我要完成的工作是让此脚本使用下一个可用的CANID创建另一行,并复制其他列的值。

enter image description here

一旦运行,结果将如下所示。注意在目标表(对于ACTID 6969)中如何更改CANID以反映正确的CANID

enter image description here

源表:

CREATE TABLE [dbo].[sourcetable]
(
    [CANID] [int] NULL,
    [COLID] [int] NULL,
    [Value1] [varchar](255) NULL,
    [Value2] [varchar](255) NULL,
    [Value3] [varchar](255) NULL,
    [Value4] [varchar](255) NULL,
    [Value5] [varchar](255) NULL
) ON [PRIMARY]
GO

Sourcetable的样本数据

INSERT INTO sourcetable (CANID,COLID,Value1,Value2,Value3,Value4,Value5) VALUES (1,21,'0.25','6.25','Chicago','-0.25','16');
INSERT INTO sourcetable (CANID,COLID,Value1,Value2,Value3,Value4,Value5) VALUES (2,65,'0.65','6.19','Dallas','0.15','65');
INSERT INTO sourcetable (CANID,COLID,Value1,Value2,Value3,Value4,Value5) VALUES (3,91,'1.65','3.25','Denver','NULL','65');
INSERT INTO sourcetable (CANID,COLID,Value1,Value2,Value3,Value4,Value5) VALUES (4,55,'1','42','Miami','0.25','NULL');

目标表:

CREATE TABLE [dbo].targettable 
(
    [CANID] [int] NULL,
    [ACCTID] [int] NULL,
) ON [PRIMARY]
GO

targettable的样本数据:

INSERT INTO targettable (CANID,ACCTID) VALUES ('1','6586');
INSERT INTO targettable (CANID,ACCTID) VALUES ('2','6658');
INSERT INTO targettable (CANID,ACCTID) VALUES ('2','6969');
INSERT INTO targettable (CANID,ACCTID) VALUES ('3','2245');
INSERT INTO targettable (CANID,ACCTID) VALUES ('4','2365');

我尝试了递归CTE,但对我来说不起作用。任何帮助将不胜感激。

SQL Server 2012。

1 个答案:

答案 0 :(得分:0)

一种方法是将两个表连接起来,并使用窗口函数在源表中生成 missing 行,方法是将源中每个canid的行数与{在目标中的{1}上方{1}}个分区中。

然后,剩下要做的就是插入目标表,并根据需要使用row_number()来增加最大值canid

row_number()

如果需要,此查询将愉快地生成几行。

Demo on DB Fiddle

CANID | COLID | Value1 | Value2 | Value3  | Value4 | Value5
----: | ----: | :----- | :----- | :------ | :----- | :-----
    1 |    21 | 0.25   | 6.25   | Chicago | -0.25  | 16    
    2 |    65 | 0.65   | 6.19   | Dallas  | 0.15   | 65    
    3 |    91 | 1.65   | 3.25   | Denver  | NULL   | 65    
    4 |    55 | 1      | 42     | Miami   | 0.25   | NULL  
    5 |    65 | 0.65   | 6.19   | Dallas  | 0.15   | 65    
相关问题