复合主键表的INSERT INTO SELECT数据同步方案咨询
复合主键表的跨库数据插入方案
针对复合主键的场景,不能只通过单个字段判断行是否存在,必须同时匹配所有主键字段。以下是几种可行的解决方法:
方法1:用NOT EXISTS子查询(推荐)
通过同时对比三个复合主键字段,精准筛选出目标表中没有的源表行,逻辑清晰且性能稳定:
INSERT INTO EFIN00123..aktivnost ( sifra_kapit_proj, sifra_aktivnosti, sifra_funkcije, naziv_aktivnosti, row_version, sifra_programa ) SELECT src.sifra_kapit_proj, src.sifra_aktivnosti, src.sifra_funkcije, src.naziv_aktivnosti, src.row_version, src.sifra_programa FROM EKUF00123..aktivnost src WHERE NOT EXISTS ( SELECT 1 FROM EFIN00123..aktivnost tgt WHERE tgt.sifra_kapit_proj = src.sifra_kapit_proj AND tgt.sifra_aktivnosti = src.sifra_aktivnosti AND tgt.sifra_funkcije = src.sifra_funkcije )
方法2:LEFT JOIN筛选无匹配行
用左连接关联两张表,筛选出目标表主键字段为NULL的行(即源表独有的行):
INSERT INTO EFIN00123..aktivnost ( sifra_kapit_proj, sifra_aktivnosti, sifra_funkcije, naziv_aktivnosti, row_version, sifra_programa ) SELECT src.sifra_kapit_proj, src.sifra_aktivnosti, src.sifra_funkcije, src.naziv_aktivnosti, src.row_version, src.sifra_programa FROM EKUF00123..aktivnost src LEFT JOIN EFIN00123..aktivnost tgt ON tgt.sifra_kapit_proj = src.sifra_kapit_proj AND tgt.sifra_aktivnosti = src.sifra_aktivnosti AND tgt.sifra_funkcije = src.sifra_funkcije WHERE tgt.sifra_kapit_proj IS NULL
方法3:EXCEPT语句(SQL Server专属)
如果使用的是SQL Server,EXCEPT语句可以直接对比两个数据集的差异,返回源表有但目标表没有的行,适合表结构完全一致的场景:
INSERT INTO EFIN00123..aktivnost ( sifra_kapit_proj, sifra_aktivnosti, sifra_funkcije, naziv_aktivnosti, row_version, sifra_programa ) SELECT sifra_kapit_proj, sifra_aktivnosti, sifra_funkcije, naziv_aktivnosti, row_version, sifra_programa FROM EKUF00123..aktivnost EXCEPT SELECT sifra_kapit_proj, sifra_aktivnosti, sifra_funkcije, naziv_aktivnosti, row_version, sifra_programa FROM EFIN00123..aktivnost
内容的提问来源于stack exchange,提问作者EternallyConfused
相关产品推荐
相关产品推荐

