我认为您需要一个 FULL JOIN(除非您确实希望将行插入到第一个表中)
SELECT COALESCE(t1.Seller, t2.Seller) AS Seller,
COALESCE(t1.Code, t2.Code) AS Code,
COALESCE(t1.Amount, 0) - COALESCE(t2.Amount, 0) AS Amount
FROM Table1 t1
FULL JOIN Table2 t2
ON t1.Seller = t2.Seller
AND COALESCE(t1.Code, 0) = COALESCE(t2.Code, 0);
如果您确实需要向表 1 插入行,则需要执行 2 次操作,首先插入,然后选择:
INSERT Table1 (Seller, Code, Amount)
SELECT t2.Seller, t2.Code, 0 AS Amount
FROM Table2 t2
WHERE NOT EXISTS
( SELECT 1
FROM Table1 t1
WHERE t1.Seller = t2.Seller
AND COALESCE(t1.Code, 0) = COALESCE(t2.Code, 0)
);
SELECT t1.Seller,
t1.Code,
t1.Amount - COALESCE(t2.Amount, 0) AS Amount
FROM Table1 t1
LEFT JOIN Table2 t2
ON t1.Seller = t2.Seller
AND COALESCE(t1.Code, 0) = COALESCE(t2.Code, 0);
编辑
如果每个表中的行不是唯一的并且您需要对它们求和,那么您需要在子查询中进行求和,因为 JOIN 将引入交叉连接:
考虑这些数据
Table1
Seller Code Amount
VL 500 10
VL 500 20
Table2
Seller Code Amount
VL 500 30
VL 500 5
当你加入这个你会得到:
t1.Seller t1.Code t1.Amount t2.Seller t2.Code t2.Amount
VL 500 10 VL 500 30
VL 500 10 VL 500 5
VL 500 20 VL 500 30
VL 500 20 VL 500 5
差的总和是 -10 而不是 -5。
SELECT COALESCE(t1.Seller, t2.Seller) AS Seller,
COALESCE(t1.Code, t2.Code) AS Code,
COALESCE(t1.Amount, 0) - COALESCE(t2.Amount, 0) AS Amount
FROM ( SELECT Seller, Code, SUM(Amount) AS Amount
FROM Table1
GROUP BY Seller, Code
) t1
FULL JOIN
( SELECT Seller, Code, SUM(Amount) AS Amount
FROM Table2
GROUP BY Seller, Code
) t2
ON t1.Seller = t2.Seller
AND COALESCE(t1.Code, 0) = COALESCE(t2.Code, 0);
编辑 2
Daniel's answer 中的 UNION 方法将比 FULL JOIN 执行得更好:
SELECT Seller, Code, Amount = SUM(Amount)
FROM ( SELECT Seller, Code, Amount
FROM Table1
UNION
SELECT Seller, Code, -Amount
FROM Table2
) t
GROUP BY Seller, Code