Table_1:
x
A
B
C
Table_2:
A | 4
B | 5
B | 6
C | 7
Table_3:
A | 7
B | 8
C | 9
Using 2 left joins I got this:
A | 4 | 7
B | 5 | 8
B | 6 | 8
C | 7 | 9
But I do group over the first column and 8 is accumulated twice, I wish to get:
A | 4 | _
A | _ | 7
B | 5 | _
B | _ | 8
B | 6 | _
C | 7 | _
C | _ | 9
I also wish to avoid UNION ALL
because my first table is actually a complex query, I wish to avoid its recalculation.
https://dbfiddle.uk/?rdbms=postgres_12&fiddle=d6012e281e3ba43487b1bfec85fd886c
Advertisement
Answer
I am not sure if that works without UNION ALL
. For example, all answers here (SQL left join two tables independently)
work with it.
So, my solution is:
SELECT
a.id,
b.val,
NULL
FROM
a
LEFT JOIN b ON a.id = b.id
UNION ALL
SELECT
a.id,
NULL,
c.val
FROM
a
LEFT JOIN c ON a.id = c.id
ORDER BY 1,2,3
Edit: Found a way using GROUPING SETS
:
SELECT
ab.*,
c.val
FROM (
SELECT
a.id,
b.val
FROM a
LEFT JOIN b ON a.id = b.id
GROUP BY GROUPING SETS ((a.id), (a.id, b.val))
) ab
LEFT JOIN c ON ab.id = c.id AND ab.val IS NULL