【问题标题】:Bidirectional outer join双向外连接
【发布时间】:2010-09-05 19:03:59
【问题描述】:

假设我们有一张表 A:

itemid mark
1      5
2      3

和表 B:

itemid mark
1      3
3      5

我想在 A.itemid=B.itemid 左右两边加入 A*B。即结果:

itemid A.mark B.mark
1      5      3
2      3      NULL
3      NULL   5

有没有办法在 MySQL 的一个查询中做到这一点?

【问题讨论】:

    标签: sql mysql


    【解决方案1】:

    可以做一些工作,但这里有一些 sql

    select distinct T.itemid, A.mark as "A.mark", B.mark as "B.mark"
        from (select * from A union select * from B) T 
        left join A on T.itemid = A.itemid 
        left join B on T.itemid = B.itemid;
    

    这依赖于左连接,它返回原始表中的所有行(在本例中是子选择表 T)。如果连接表中没有匹配项,则将列设置为 NULL。

    【讨论】:

      【解决方案2】:

      这适用于我在 SQL Server 上:

      select isnull(a.id, b.id), a.mark, b.mark
      from a 
      full outer join b on b.id = a.id
      

      【讨论】:

      • 问题明确指出 MySQL
      【解决方案3】:

      它被称为完全外连接,从它的docs 来看,它在 MySQL 中不被原生支持。您可以使用 UNION 解决此限制,如我链接到的页面的 cmets 中所述。

      [编辑] 既然其他人发布了 sn-ps,就这样吧。您可以在链接页面上查看说明。

      SELECT *
      FROM A LEFT JOIN B ON A.id = B.id
      UNION ALL
      SELECT *
      FROM A RIGHT JOIN B ON A.id = B.id
      WHERE A.id IS NULL
      

      【讨论】:

        猜你喜欢
        • 2014-12-04
        • 1970-01-01
        • 2010-12-06
        • 2013-03-13
        • 1970-01-01
        • 1970-01-01
        • 2013-03-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多