【问题标题】:Outer Join on multiple tables多个表的外部联接
【发布时间】:2013-07-06 03:29:01
【问题描述】:
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;

请告诉我这里出了什么问题。

我想要三个表的完全外连接:table1、table2 和 table3(MYSQL 不支持)

【问题讨论】:

  • 表结构在哪里?
  • 请提供真实的表名。 table1、table2、table3 真的很难读。
  • @ypercube:整个查询很难阅读。不仅仅是表名;这也是不幸的格式。引入“table4”作为内联视图的别名也没有任何改进。
  • @spencer7593 这是“unformatting”(与“undead”押韵。)

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


【解决方案1】:

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

第一个查询是 table1 中的所有 tid 值。第二个查询从表 2 中获取表 1 中不存在的所有 tid 值。第三个查询获取 table3 中的所有 tid 值,这些值在 table1 中不存在且在 table2 中不存在。第二个和第三个查询中的“技巧”包括适当的

tid IS NULL

WHERE 子句中的谓词,以确保省略先前查询返回的 tid 值。 (如果我们不能保证 tid 不是 NULL,我们可能希望通过在“驱动”表的每个查询中包含适当的 tid IS NOT NULL 谓词来避免为 tid 返回 NULL 值,其中下面的例子是 FROM 关键字后面的表格。)

最后一步是将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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-07
      • 2017-03-24
      • 2012-12-28
      • 1970-01-01
      • 2011-05-14
      • 2020-10-25
      • 1970-01-01
      • 2013-10-22
      相关资源
      最近更新 更多