Em consultas onde comparo dados entre 2 tabelas, costumo usar a combinação de COALESCE
e FULL OUTER JOIN
para exibir registros disponíveis apenas em 1 das tabelas.
Isso pode ser feito com menos açúcar sintático? (Não me refiro a substituir COALESCE
por NVL
algo assim.)
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
A maneira como você escreveu a consulta é a maneira correta de fazê-la e
COALESCE
é necessária para que ela funcione corretamente, pois qualquer coluna pode ser nula em uma junção externa completa.Eu criaria o hábito, porém, de nomear os resultados da operação de forma diferente da coluna. Aqui você trabalha em uma coluna chamada
amount
e nomeia o resultadoamount
:Eu preferiria fazer isso
E quanto ao ID: você pode usar
USING
em vez deON
para evitar ter que trabalharCOALESCE
nas colunas unidas.USING
é muito típico para consultas de junção externa completa e se torna ainda mais útil quando se junta externamente mais de uma tabela na mesma coluna.Não sei se isso é melhor.