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)