SQL中的全外连接
来源:互联网 发布:php分割中文字符串 编辑:程序博客网 时间:2024/05/16 13:07
今天看到一贴, 说到 MySQL 不支持全外连接, 希望能给出一个方法能够解决这个问题.
我们首先必须明白在数学领域, set 和 bag 是两种不同的概念. bag 比 set 更加复杂. 主要就是允许了元素的重复出现. 因此 bag 的union, intersect, difference 也就有了些区别.
要模拟全外连接, 我们需要借助: 左外连接(右外连接是左外连接的对称运算...), UNION ALL, EXCEPT ALL.
为什么要用 UNION ALL, EXCEPT ALL? 因为 JOIN 操作产生的结果集是 bag, 因此必须使用 bag 运算符.
我没有花太多时间设计测试用例, 这里只是简单的给出几个错误的结果, 希望大家平时应用小心.
SQL SERVER 2005 虽然支持全外连接, 但是不支持 EXCEPT ALL, 因此无法模拟这个过程. 需要注意使用混合使用 bag 和 set 的运算符将会对结果产生影响. 除非你清楚你的目的, 否则永远不要把它们混合在一起.
下面是测试用例的准备:
CREATE TABLE a(c INT);
CREATE TABLE b(c INT);
INSERT INTO a VALUES(1);
INSERT INTO a VALUES(2);
INSERT INTO a VALUES(3);
INSERT INTO b VALUES(1);
INSERT INTO b VALUES(1);
INSERT INTO b VALUES(2);
INSERT INTO b VALUES(4);
下面是在SQL Server 2005中执行的标准输出结果(5条!):
SELECT * FROM a FULL JOIN b ON a.c = b.c;
c c
----------- -----------
1 1
1 1
2 2
3 NULL
NULL 4
(5 row(s) affected)
我们看到了两行(1,1), 这就是我们需要注意的 bag 才具有的行为. 下面是几个典型的错误语句:
SELECT * FROM a LEFT JOIN b ON a.c = b.c UNION SELECT * FROM a RIGHT JOIN b ON a.c = b.c;
c c
----------- -----------
NULL 4
1 1
2 2
3 NULL
(4 row(s) affected)
SELECT * FROM a LEFT JOIN b ON a.c = b.c UNION ALL SELECT * FROM a RIGHT JOIN b ON a.c = b.c;
c c
----------- -----------
1 1
1 1
2 2
3 NULL
1 1
1 1
2 2
NULL 4
(8 row(s) affected)
SELECT a.c, b.c FROM a LEFT JOIN b ON a.c = b.c
UNION
SELECT a.c, b.c FROM b LEFT JOIN a ON a.c = b.c
WHERE a.c IS NULL;
c c
----------- -----------
NULL 4
1 1
2 2
3 NULL
(4 row(s) affected)
正确的应该是:
SELECT * FROM a LEFT JOIN b ON a.c = b.c UNION ALL SELECT * FROM a RIGHT JOIN b ON a.c = b.c EXCEPT ALL SELECT * FROM a INNER JOIN b ON a.c = b.c;
希望大家小心 bag 和 set 的区别. 你还可以指定 DISTINCT 消除重复元组. 但是你必须清楚这些操作的影响, 有人说 bag 操作是 SQL 语言最大的缺点... 我倒觉得仁者见仁, 智者见智. 就好像有人说 '第一范式' 关于不应该有 NULL 值的问题, 认为既然最初允许了 NULL 为什么第一范式就要禁止呢?
最后大家要注意 wikipedia 上关于 JOIN 的说明并没有考虑 bag 的情况, 而是当作 set 给出的例子. 希望不是 wikipedia 的错误, 端午过后, 我再去仔细求证一下.
- SQL中的全外连接
- SQL中的内连接,左外连接,右外连接,全连接,交叉连接
- SQL语句中的左连接、右连接、交叉连接、全外连接
- SQL中的内连接,外连接,全连接和交叉连接
- SQL内连接、外连接、全连接
- SQL中的内连接、外联接、全连接
- sql连接(内连接、外连接、全连接)
- [转]SQl中的左连接,右连接,内连接,全连接,自连接的理解
- SQl中的左连接,右连接,内连接,全连接,自连接的理解。
- SQl中的左连接,右连接,内连接,全连接,自连接的理解
- sql语句中的连接(join)左连接,右连接,全连接,交叉连接
- SQL中的内连接、左连接、右连接、全连接、交叉连接
- sql左外连接、右外连接、全外连接
- SQL 左外连接,右外连接,全连接2
- sql中内连接、外连接、全连接
- SQL连接查询 内连接,左外连接,右外连接,全连接,交叉连接
- 深入浅出SQL系列教程(第七节-SELECT语句中的左连接、右连接和全连接)
- sql的交叉连接,内连接,左外连接,右外连接,全外连接总结
- 国外大学免费硕博全文数据库以及部分期刊全文
- 使用 ANT 来发布Flex
- Jsp 分页技术
- 应对敏捷项目中的干扰
- 全球最大的黑客门户网站
- SQL中的全外连接
- 转换字符级的技术 ---------长沙大学地物联盟
- MXML中的命名空间
- 错误检测工具BoundsChecker使用介绍
- 添加SuperMap组件后,无法触发Shown事件
- 模板高级编程
- Good News -- 投稿到《机器人》的论文也被录用了
- 记录窗口位置与大小
- javabean数据库连接类DBCon----长沙大学地物联盟