在比较 2 个表之间的数据的查询中,我经常使用
COALESCE
和 FULL OUTER JOIN
的组合来显示仅在其中 1 个表中可用的记录。
这可以用更少的语法糖来完成吗? (我并不是说用
COALESCE
等替换 NVL
。)
WITH Dataset1 AS (
SELECT
id,
SUM(amount) AS amount
FROM
table1
GROUP BY
id
),
Dataset2 AS (
SELECT
id,
SUM(amount) AS amount
FROM
table2
GROUP BY
id
)
SELECT
COALESCE(d1.id, d2.id) AS ID,
COALESCE(d1.amount, 0) AS D1_AMOUNT,
COALESCE(d2.amount, 0) AS D2_AMOUNT,
COALESCE(d1.amount, 0) - COALESCE(d2.amount, 0) AS DELTA
FROM
Dataset1 d1
FULL OUTER JOIN
Dataset2 d2 c ON
d2.id = d1.id
WHERE
ABS(COALESCE(d1.amount, 0) - COALESCE(d2.amount, 0)) >= 5
ORDER BY
ID
我不知道这样是否更好,但我会这样写
WITH DataSet(ID, D1_AMOUNT, D2_AMOUNT, DELTA) AS(
Select ID, SUM(COALESCE(Amount,0)), 0 , SUM(COALESCE(Amount,0))
FROM table1
Group BY ID
UNION ALL
Select ID, 0, SUM(COALESCE(Amount,0)), SUM(COALESCE(Amount,0))*-1
FROM table2
GROUP BY ID
), DataSet2(ID, D1_AMOUNT, D2_AMOUNT, DELTA) AS (
SELECT ID,SUM(D1_AMOUNT),SUM(D2_AMOUNT), SUM(DELTA)
FROM DataSet
GROUP BY ID
)
Select *
FROM Dataset2
WHERE ABS(DELTA)>5