Saya tidak tahu apakah saya memahami masalah Anda, tetapi mengapa Anda menggunakan LEFT JOIN? Ceritanya terdengar lebih seperti INNER JOIN. Tidak ada yang membutuhkan UNION.
[Sunting] Oke, saya rasa saya mengerti apa yang Anda inginkan sekarang. Saya belum pernah mencoba apa yang akan saya sarankan, dan terlebih lagi, beberapa DB tidak mendukungnya (belum), tetapi saya pikir Anda menginginkan fungsi windowing.
WITH Y2 AS (SELECT Y.*, ROW_NUMBER() OVER (PARTITION BY A) AS YROW FROM Y),
Z2 AS (SELECT Z.*, ROW_NUMBER() OVER (PARTITION BY A) AS ZROW FROM Z)
SELECT COALESCE(Y2.A,Z2.A) AS A, Y2.C, Y2.D, Z2.E, Z2.F, Z2.G
FROM Y2 FULL OUTER JOIN Z2 ON Y2.A=Z2.A AND YROW=ZROW;
Idenya adalah untuk mencetak daftar dalam baris sesedikit mungkin, bukan? Jadi jika A1 memiliki 10 entri di Y dan 7 di Z, maka kita mendapatkan 10 baris dengan 3 memiliki NULL untuk bidang Z. Ini berfungsi di Postgres. Saya tidak percaya sintaks ini tersedia di MySQL.
Y:
a | d | c
---+---+----
1 | 1 | -1
1 | 2 | -1
2 | 0 | -1
Z:
a | f | g | e
---+---+---+---
1 | 9 | 9 | 0
2 | 1 | 1 | 0
3 | 0 | 1 | 0
Output dari pernyataan di atas:
a | c | d | e | f | g
---+----+---+---+---+---
1 | -1 | 1 | 0 | 9 | 9
1 | -1 | 2 | | |
2 | -1 | 0 | 0 | 1 | 1
3 | | | 0 | 0 | 1