select table3.tid, table3.name, talble4.name1, table4.name2 from table3 left join
(select table1.tid, table1.name as name1, table2.name as name2 from table1 left join table2
on table1.tid = table2.tid
union
select table2.tid, table1.name, table2.name from table1 right join table2
on table1.tid = table2.tid) as table4;
请告诉我这里有什么问题。
我想要3个表的完全外连接:table1,table2和table3(MYSQL不支持)
答案 0 :(得分:1)
我将使用三个单独的查询模拟三个表的“完全外部联接”,并将这些行与UNION ALL操作连接在一起。
第一个查询是table1中的所有tid
值。第二个查询获取table2中table1中不存在的所有tid
值。第三个查询获取table3中的所有tid
值,这些值在table1中不存在,并且在table2中不存在。第二和第三个查询中的“技巧”包括适当的
tid IS NULL
WHERE子句中的谓词,以确保省略先前查询返回的tid
值。 (如果我们不能保证tid
不是NULL,我们可能希望通过在每个查询中包含适当的tid
谓词来避免为tid IS NOT NULL
返回NULL值。驱动“表,在下面的示例中是FROM关键字后面的表。”
最后一步是在选择列表中包含name
列。为了保持一致性,我将table1中的name值放在同一列中。 (在第二个查询中,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
答案 1 :(得分:0)
您好,在SQL中的table4之后似乎没有“on table3.JoinColumn = table4.JoinColumn”。我认为你已经被标记了,因为你没有说出你的错误是什么,我认为你的问题有点模糊。但也许我给出的SQL可能是您完成任务所需的全部内容......