Nie wiem, czy rozumiem Twój problem, ale dlaczego używasz LEFT JOIN? Historia brzmi bardziej jak WEWNĘTRZNE ŁĄCZENIE. Nic tutaj nie wzywa do UNII.
[Edytuj] OK, myślę, że teraz rozumiem, czego chcesz. Nigdy nie próbowałem tego, co zamierzam zasugerować, a co więcej, niektóre bazy danych nie obsługują tego (jeszcze), ale myślę, że potrzebujesz funkcji okienkowania.
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;
Chodzi o to, aby wydrukować listę w jak najmniejszej liczbie wierszy, prawda? Więc jeśli A1 ma 10 wpisów w Y i 7 w Z, to otrzymujemy 10 wierszy, z których 3 mają wartości NULL dla pól Z. Działa to w Postgresie. Nie wierzę, że ta składnia jest dostępna w MySQL.
T:
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
Wynik powyższego oświadczenia:
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