免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 17679 | 回复: 9
打印 上一主题 下一主题

请教:mysql 中的 “全外连接” [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-06-05 23:23 |只看该作者 |倒序浏览
用mysql做一个软件,但是需要用到 全外连接 ,但是用全外连接时总是报错,在网上查了一下,说mysql 不支持全外连接,我晕。
我用的mysql版本是5.0.22,(左外连接和右外连接都很好用)

问题 1:这样在不支持全外连接的情况先实现 全外连接 的查询功能?
问题 2:mysql到底不支持全外连接吗?(是不是我用的版本低的原因)
我的测试用例:

表A 结构
  id int(11) 主码
  numa int(11)
  name varchar(11)
  pass varchar(11)

数据:
+----+------+------+------+
| id | numa | name | pass |
+----+------+------+------+
|  1 |    1 | a    | a    |
|  2 |    2 | b    | b    |
+----+------+------+------+

表B 结构

  id int(11)  主码
  numb int(11)
  readme varchar(11)

数据:
+----+------+---------+
| id | numb | readme  |
+----+------+---------+
|  1 |    1 | 1111111 |
| 10 |   10 | 1010101 |
+----+------+---------+



左外连接:
mysql> select * from a left outer join b on numa=numb;
+----+------+------+------+------+------+---------+
| id | numa | name | pass | id   | numb | readme  |
+----+------+------+------+------+------+---------+
|  1 |    1 | a    | a    |    1 |    1 | 1111111 |
|  2 |    2 | b    | b    | NULL | NULL | NULL    |
+----+------+------+------+------+------+---------+



右外连接:
mysql> select * from a right outer join b on numa=numb;
+------+------+------+------+----+------+---------+
| id   | numa | name | pass | id | numb | readme  |
+------+------+------+------+----+------+---------+
|    1 |    1 | a    | a    |  1 |    1 | 1111111 |
| NULL | NULL | NULL | NULL | 10 |   10 | 1010101 |
+------+------+------+------+----+------+---------+



全外连接:
mysql> select * from a full outer join b on numa=numb;

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that
corresponds to your MySQL server version for the right syntax to use near 'outer
join b on numa=numb' at line 1

论坛徽章:
0
2 [报告]
发表于 2008-06-06 10:29 |只看该作者
Try left outer join union  all right outer join

论坛徽章:
0
3 [报告]
发表于 2008-06-06 15:24 |只看该作者
原帖由 yueliangdao0608 于 2008-6-6 10:29 发表
Try left outer join union  all right outer join


union all 不正确.
因为包含了两个inner join的结果.

union all之后必须except all 一个 inner join的结果才行.

不过用到全外连接, 还是看看应用是不是设计有不合理.

PS: MySQL 不支持 全外连接.

论坛徽章:
0
4 [报告]
发表于 2008-06-06 15:40 |只看该作者
原帖由 Edengundam 于 2008-6-6 15:24 发表


union all 不正确.
因为包含了两个inner join的结果.

union all之后必须except all 一个 inner join的结果才行.

不过用到全外连接, 还是看看应用是不是设计有不合理.

PS: MySQL 不支持 全外连接.



List the result of your test here.
or whatever you said is nonsense.

论坛徽章:
0
5 [报告]
发表于 2008-06-06 15:49 |只看该作者
原帖由 yueliangdao0608 于 2008-6-6 15:40 发表



List the result of your test here.
or whatever you said is nonsense.


A表:
C
---
1
2
3
(3 rows)

B表:
C
---
1
2
4
1
(4 rows)

自己试试吧. UNION ALL不能用, UNION 也不能用的. 懒得贴结果了

论坛徽章:
0
6 [报告]
发表于 2008-06-06 17:21 |只看该作者
原帖由 Edengundam 于 2008-6-6 15:49 发表


A表:
C
---
1
2
3
(3 rows)

B表:
C
---
1
2
4
1
(4 rows)

自己试试吧. UNION ALL不能用, UNION 也不能用的. 懒得贴结果了


You're right,OK!

论坛徽章:
0
7 [报告]
发表于 2008-06-06 17:33 |只看该作者
I post my test result here.

The result generated with Sql Server.
select * from g full outer join t1 on g.id = t1.id;


2        2
3        NULL
4        NULL
5        NULL
NULL        1



MySQL


select * from g left outer join t1 on g.id = t1.id
union
select * from g right outer join t1 on g.id = t1.id;

+------+------+
| id   | id   |
+------+------+
|    2 |    2 |
|    3 | NULL |
|    4 | NULL |
|    5 | NULL |
| NULL |    1 |
+------+------+
5 rows in set (0.00 sec)

[ 本帖最后由 yueliangdao0608 于 2008-6-6 17:37 编辑 ]

论坛徽章:
0
8 [报告]
发表于 2008-06-06 22:20 |只看该作者
UNION 是一个集合运算符, 会导致重复的元组被消去, 这将导致结果不一致.

论坛徽章:
0
9 [报告]
发表于 2011-01-31 10:35 |只看该作者
本帖最后由 zj21cn 于 2011-01-31 10:36 编辑

我郁闷了,翻出一张老贴

还有点不明白:
如何不显示相同的行?

就是不显示下面这一行:
+------+------+
| id   | id   |
+------+------+
|    2 |    2 |

论坛徽章:
0
10 [报告]
发表于 2011-02-09 16:12 |只看该作者
mysql不支持全外连接,至少在5.1.45以前是不支持的,后面的没有测试

可以用2个左外连接来实现全连接的功能。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP