我会用三个单独的查询来模拟三个表的“完全外连接”,其中行与 UNION ALL 操作连接在一起。
第一个查询是tid
table1 中的所有值。第二个查询tid
从 table2 中获取 table1 中不存在的所有值。第三个查询获取tid
table3 中不存在于 table1 且不存在于 table2 的所有值。第二个和第三个查询中的“技巧”包括适当的
tid IS NULL
WHERE 子句中的谓词,以确保tid
省略先前查询返回的值。(如果我们不能保证它tid
不是 NULL,我们可能希望通过 在“驱动”表的每个查询中tid
包含适当的谓词来避免返回 NULL 值,在下面的示例中是 FROM 之后的表tid IS NOT NULL
关键词。)
最后一步是将name
列包含在选择列表中。为了保持一致,我将 table1 中的名称值放在同一列中。(在第二个查询中,name1 列将始终为 NULL,在第三个查询中,name1 和 name2 列将始终为 NULL。)
SELECT a.tid
, a.name AS name1
, b.name AS name2
, c.name AS name3
FROM table1 a
LEFT
JOIN table2 b ON b.tid = a.tid
LEFT
JOIN table3 c ON c.tid = a.tid
UNION ALL
SELECT d.tid
, f.name AS name1
, d.name AS name2
, e.name AS name3
FROM table2 d
LEFT
JOIN table3 e ON e.tid = d.tid
LEFT
JOIN table1 f ON f.tid = d.tid
WHERE f.tid IS NULL
UNION ALL
SELECT g.tid
, h.name AS name1
, i.name AS name2
, g.name AS name3
FROM table3 g
LEFT
JOIN table1 h ON h.tid = g.tid
LEFT
JOIN table2 i ON i.tid = g.tid
WHERE h.tid IS NULL
AND i.tid IS NULL