在比较 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
您编写查询的方式是正确的方式,并且
COALESCE
对于它正常工作是必要的,因为在完整外连接中任何列都可以为空。不过,我会养成一种习惯,以不同于列的方式命名操作结果。在这里,您处理名为 的列
amount
并将结果命名为amount
:我宁愿做这个
至于 ID:您可以使用
USING
而不是ON
避免COALESCE
在连接的列上使用。USING
对于完全外连接查询来说是非常典型的,并且当在同一列上外连接多个表时变得更加方便。我不知道这样是否更好。