关于sql:什么是正确的MySql FULL JOIN语法?

What is the correct MySql FULL JOIN syntax?

本问题已经有最佳答案,请猛点这里访问。

下面是我的两个表;我想要如第三个表所示的结果。我如何在MySQL中做到这一点(假设完全连接)?

表销售

1
2
3
4
5
product_id    quantity    date
c001          20        2013-09-03
t008          30        2013-09-01
t008          20        2013-09-03
c001          90        2013-09-09

表返回

1
2
3
4
product_id    quantity    date
t008          40        2013-09-08
t008          30        2013-09-01
c001          10        2013-09-03

我想得到如下结果:

1
2
3
4
5
6
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的首选方法是获得所有ID的列表和left join到该列表:

1
2
3
4
5
6
7
8
9
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子句中更方便查询。有关处理变量、公式和联接的逻辑只需包含一次。

下面是SQL小提琴,它说明了它的工作原理。


MySQL不支持完全外部连接。

所以如果你想在mysql上模拟一个完整的连接,请看这里。

这是一个非常有帮助的完整链接,描述完整连接的解决方案

解决方案示例如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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