mysql实现full outer join

由于mysql设计时不支持full outer join,

所以如果有全连接需求时,需要一点小技巧来实现。

full outer join = left outer join union all right outer join


看如下表结构:

A:

+------+----------+
| id   | username |
+------+----------+
|    1 | wuwh     |
|    2 | meimei   |
+------+----------+


B:

+------+------------+
| id   | objectname |
+------+------------+
|    1 | 电子     |
|    3 | 衣服     |
+------+------------+


C:

+------+--------------+
| id   | detail       |
+------+--------------+
|    1 | 电子详情 |
|    3 | 衣服详情 |
|    4 | 车子详情 |
+------+--------------+


先实现一个小需求:

A full outer join B之后,合并两列id,并且id不能重复,sql如下:


select distinct aaabbb.aaabbb_id,username,objectname from(

SELECT 

CASE 

WHEN aaa.id IS NOT NULL THEN aaa.id 

WHEN bbb.id IS NOT NULL THEN bbb.id 

END AS aaabbb_id, 

username, objectname

 FROM aaa left join bbb on aaa.id = bbb.id 

union all 

SELECT 

CASE 

WHEN aaa.id IS NOT NULL THEN aaa.id 

WHEN bbb.id IS NOT NULL THEN bbb.id 

END AS aaabbb_id, 

username, objectname 

FROM aaa right join bbb on aaa.id = bbb.id;

)ccc

结果:

+-----------+----------+------------+
| aaabbb_id | username | objectname |
+-----------+----------+------------+
|         1 | wuwh     | 电子     |
|         2 | meimei   | NULL       |
|         3 | NULL     | 衣服     |
+-----------+----------+------------+



接下来是三路full outer join

SELECT DISTINCT com_id
, username
, objectname
, detail
FROM (
SELECT IF(aaabbb.aaabbb_id IS NOT NULL, aaabbb.aaabbb_id, IF(ccc.id IS NOT NULL, ccc.id, '')) AS com_id
, username
, objectname
, detail
FROM (
SELECT CASE 
WHEN aaa.id IS NOT NULL THEN aaa.id
WHEN bbb.id IS NOT NULL THEN bbb.id
END AS aaabbb_id
, username
, objectname
FROM aaa
LEFT OUTER JOIN bbb
ON aaa.id = bbb.id
UNION ALL
SELECT CASE 
WHEN aaa.id IS NOT NULL THEN aaa.id
WHEN bbb.id IS NOT NULL THEN bbb.id
END AS aaabbb_id
, username
, objectname
FROM aaa
RIGHT OUTER JOIN bbb
ON aaa.id = bbb.id
) aaabbb
LEFT OUTER JOIN ccc
ON aaabbb.aaabbb_id = ccc.id
UNION ALL
SELECT IF(aaabbb.aaabbb_id IS NOT NULL, aaabbb.aaabbb_id, IF(ccc.id IS NOT NULL, ccc.id, '')) AS com_id
, username
, objectname
, detail
FROM (
SELECT CASE 
WHEN aaa.id IS NOT NULL THEN aaa.id
WHEN bbb.id IS NOT NULL THEN bbb.id
END AS aaabbb_id
, username
, objectname
FROM aaa
LEFT OUTER JOIN bbb
ON aaa.id = bbb.id
UNION ALL
SELECT CASE 
WHEN aaa.id IS NOT NULL THEN aaa.id
WHEN bbb.id IS NOT NULL THEN bbb.id
END AS aaabbb_id
, username
, objectname
FROM aaa
RIGHT OUTER JOIN bbb
ON aaa.id = bbb.id
) aaabbb
RIGHT OUTER JOIN ccc
ON aaabbb.aaabbb_id = ccc.id
) ddd;

结果:

+--------+----------+------------+--------------+
| com_id | username | objectname | detail       |
+--------+----------+------------+--------------+
| 1      | wuwh     | 电子     | 电子详情 |
| 3      | NULL     | 衣服     | 衣服详情 |
| 2      | meimei   | NULL       | NULL         |
| 4      | NULL     | NULL       | 车子详情 |
+--------+----------+------------+--------------+


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值