【问题标题】:What is the correct MySql FULL JOIN syntax? [duplicate]什么是正确的 MySql FULL JOIN 语法? [复制]
【发布时间】:2013-09-12 03:14:54
【问题描述】:

以下是我的两张表;我想要第三个表中所示的结果。我如何在 MySQL 中做到这一点(假设 FULL JOIN)?

table_sales

product_id    quantity    date
c001          20        2013-09-03
t008          30        2013-09-01
t008          20        2013-09-03
c001          90        2013-09-09

table_returns

product_id    quantity    date
t008          40        2013-09-08
t008          30        2013-09-01
c001          10        2013-09-03

我想得到如下结果:

product_id     sale_qty      return_qty        date
c001           20            10              2013-09-03
c001           90            -               2013-09-09
t008           30            30              2013-09-01
t008           20            -               2013-09-01
t008           -             40              2013-09-08

【问题讨论】:

  • 是的,这是一个 FULL JOIN——你是在问语法是什么?或者如何给事物起别名?还是……?
  • @Alexander 我找不到我想要的答案,所以我发了这篇文章
  • 你可以随时升级到 Postgres ;) (SCNR)

标签: mysql sql join


【解决方案1】:

我首选的full join 方法是获取所有ID 的列表和left join 到该列表:

select driver.product_id, s.quantity as sale_qty, r.quantity as return_qty, driver.date
from (select product_id, date from table_sales
      union 
      select product_id, date from table_returns
     ) driver left join
     table_sales s
     on driver.product_id = s.product_id and driver.date = s.date left join
     table_returns r
     on driver.product_id = r.product_id and driver.date = r.date;

我发现将union 放在from 子句中会使查询更方便。处理变量、公式和连接的逻辑只需包含一次。

Here 是证明它有效的 SQL Fiddle。

【讨论】:

    【解决方案2】:

    MySQL 不支持 FULL OUTER JOIN。

    因此,如果您想在 MySQL 上模拟完全连接,请查看 here

    这是一个非常有用的链接,描述了完全加入的解决方法

    示例解决方法类似于

    SELECT  t_13.value AS val13, t_17.value AS val17
    FROM    t_13
    LEFT JOIN
    t_17
    ON      t_13.value = t_17.value
    UNION ALL
    SELECT  t_13.value AS val13, t_17.value AS val17
    FROM    t_13
    RIGHT JOIN
    t_17
    ON      t_13.value = t_17.value
    WHERE   t_13.value IS NULL
    ORDER BY
    COALESCE(val13, val17)
    LIMIT 30
    

    【讨论】:

      猜你喜欢
      • 2020-03-07
      • 2011-01-23
      • 2015-11-21
      • 2017-05-29
      • 1970-01-01
      相关资源
      最近更新 更多