外部加入多个表

时间:2013-07-08 17:38:05

标签: mysql sql outer-join full-outer-join

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不支持)

2 个答案:

答案 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可能是您完成任务所需的全部内容......