我不知道我是否理解你的问题,但你为什么要使用LEFT JOIN?这个故事听起来更像是INNER JOIN.这里没有任何东西需要UNION.
[编辑]
好的,我想我现在看到了你想要的东西.我从来没有尝试过我要提出的建议,而且还有一些DB不支持它(但是),但我认为你想要一个窗口函数.
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;
我的想法是尽可能少地打印列表,对吧?因此,如果A1在Y中有10个条目,在Z中有7个,那么我们得到10行,其中3个为Z字段具有NULL.这适用于Postgres.我不相信这种语法在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
上述声明的输出:
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