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

4

2 回答 2

1

我会用三个单独的查询来模拟三个表的“完全外连接”,其中行与 UNION ALL 操作连接在一起。

第一个查询是tidtable1 中的所有值。第二个查询tid从 table2 中获取 table1 中不存在的所有值。第三个查询获取tidtable3 中不存在于 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
于 2013-07-08T17:55:12.727 回答
0

嗨,您的 SQL 中的 table4 之后似乎没有“on table3.JoinColumn = table4.JoinColumn”。我认为您已被标记为因为您没有说出您的错误是什么,而且我认为您的问题有点含糊。但也许我给出的 SQL 可能就是你完成任务所需要的全部......

于 2013-07-08T17:43:41.643 回答