当前位置: 代码迷 >> Sql Server >> 依据源表向目标表插入数据,两次插入,分别不同的判断
  详细解决方案

依据源表向目标表插入数据,两次插入,分别不同的判断

热度:102   发布时间:2016-04-24 08:46:49.0
根据源表向目标表插入数据,两次插入,分别不同的判断
1,源表是不断新增数据的,PO是一个单号;
2,目标表ID是流水号,PO是源表的PO,每个源表的PO在目标表中对应BatchNo为1和2两个(以后可能3个以上);
3,有一个计划任务来执行SQL,判断源表中的PO和BatchNo是否存在目标表中,如果不存在就插入PO和不存在的BatchNO。

比如源表新增一条PO为A的记录,要分别判断目标表中是否有PO为A的,且BatchNo为1和2的记录,如果缺哪个就插入哪个。

--目标表:
select 1 as ID,'A' as PO,'1' as BatchNo
union all
select 2 as ID,'B' as PO,'1' as BatchNo
union all
select 3 as ID,'C' as PO,'1' as BatchNo
union all
select 4 as ID,'D' as PO,'1' as BatchNo
union all
select 5 as ID,'A' as PO,'2' as BatchNo
union all
select 6 as ID,'F' as PO,'2' as BatchNo
union all
select 7 as ID,'G' as PO,'2' as BatchNo
union all
select 8 as ID,'H' as PO,'1' as BatchNo


--源表:
select 'A' PO
union all
select 'B' PO
union all
select 'C' PO
union all
select 'D' PO
union all
select 'E' PO
union all
select 'F' PO
union all
select 'G' PO
union all
select 'H' PO

------解决思路----------------------
使用EXCEPT 集合运算符,将差集插入到目标表就OK了,这样可以吗?

DECLARE  @目标表 TABLE
(
ID INT IDENTITY(1,1),
PO VARCHAR(32),
BatchNO VARCHAR(32)
)
INSERT INTO @目标表 SELECT * FROM
(
SELECT A.PO, B.BatchNO FROM 
(
select 'A' PO
union all
select 'B' PO
union all
select 'C' PO
union all
select 'D' PO
union all
select 'E' PO
union all
select 'F' PO
union all
select 'G' PO
union all
select 'H' PO
) AS A
CROSS JOIN
(
SELECT '1' BatchNO
UNION ALL
SELECT '2' BatchNO
) AS B
EXCEPT
SELECT C.PO, C.BatchNo FROM
(
select 1 as ID,'A' as PO,'1' as BatchNo
union all
select 2 as ID,'B' as PO,'1' as BatchNo
union all
select 3 as ID,'C' as PO,'1' as BatchNo
union all
select 4 as ID,'D' as PO,'1' as BatchNo
union all
select 5 as ID,'A' as PO,'2' as BatchNo
union all
select 6 as ID,'F' as PO,'2' as BatchNo
union all
select 7 as ID,'G' as PO,'2' as BatchNo
union all
select 8 as ID,'H' as PO,'1' as BatchNo
) AS C
) AS D
SELECT * FROM @目标表

------解决思路----------------------
;WITH t1(BatchNo)AS(
    SELECT 1 UNION ALL
    SELECT 2
)
,t2(PO,BatchNo)AS(
    SELECT 源表.PO,
           t1.BatchNo
      FROM 源表, t1
)
INSERT INTO 目标表(PO,BatchNo)
SELECT *
  FROM t2
 WHERE NOT EXISTS(SELECT *
                    FROM 目标表
                   WHERE 目标表.PO = t2.PO
                     AND 目标表.BatchNo = t2.BatchNo)
  相关解决方案