我可以在 FULL OUTER JOIN 期间避免 COALESCE 吗?

问题描述 投票:0回答:1

在比较 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
sql oracle oracle-sqldeveloper full-outer-join
1个回答
0
投票

我不知道这样是否更好,但我会这样写

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
© www.soinside.com 2019 - 2024. All rights reserved.