基本上,如果CANID在targettable中作为重复项存在,我想做的就是在sourcetable中创建一个新的重复项行。例如,在此集合中,CANID'2'作为副本存在于targettable中,但在源表中仅存在一次。我要完成的工作是让此脚本使用下一个可用的CANID创建另一行,并复制其他列的值。
一旦运行,结果将如下所示。注意在目标表(对于ACTID 6969)中如何更改CANID以反映正确的CANID
源表:
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。
答案 0 :(得分:0)
一种方法是将两个表连接起来,并使用窗口函数在源表中生成 missing 行,方法是将源中每个canid
的行数与{在目标中的{1}上方{1}}个分区中。
然后,剩下要做的就是插入目标表,并根据需要使用row_number()
来增加最大值canid
:
row_number()
如果需要,此查询将愉快地生成几行。
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