为什么table2中没有对应的字段时,什么都显示不出来
解决方案 »
- 紧急求救,遇到鬼了,这个sql咋回事啊!!???
- Oracle Bulk Loader是什么玩意?
- opps_zhou帮我~~Job引号问题
- 问一个视图关联表的问题
- 方法怎么返回一个字符串数组
- 关于用户误操作的回退问题,向大家请教方法和策略.我oracle9i的闪回(flashback)以及表空间含多个数据的问题,
- 问使用rownum筛选记录?
- vb里访问oracle数据库,语句应该怎么写!!急!!在线等!!!!
- 导入问题!
- 同義字 建立的權限問題
- 如何将sql server中的外连接语句在oracle中使用 呀?
- 请问用C#连接远程Oracle数据库是否一定要在本地安装Oracle客户端???
oracle sql reference讲解很清楚。
主表a,子表b
select a.*,b.* from a,b where a.id=b.id(+);
原因是子表b在a表中没有对应记录,但主表所有记录必须全显示,那做一个左连接,保证主表没有对应的记录情况下也全显示,而b表没有对应记录只能显示为null.
----------
1
2
3SQL> select id from tab2;ID
----------
2
3
4SQL>
SQL> select tab1.id,tab2.id from tab1,tab2 where tab1.id=tab2.id;ID ID
---------- ----------
2 2
3 3SQL> select tab1.id,tab2.id from tab1,tab2 where tab1.id(+)=tab2.id;ID ID
---------- ----------
2 2
3 3
4SQL> select tab1.id,tab2.id from tab1,tab2 where tab1.id=tab2.id(+);ID ID
---------- ----------
1
2 2
3 3
没有值可以“等联接”出来的字段为空值
----------
1
2
3SQL> select id from tab2;ID
----------
2
3
4SQL>
SQL> select tab1.id,tab2.id from tab1,tab2 where tab1.id=tab2.id;ID ID
---------- ----------
2 2
3 3SQL> select tab1.id,tab2.id from tab1,tab2 where tab1.id(+)=tab2.id;ID ID
---------- ----------
2 2
3 3
4SQL> select tab1.id,tab2.id from tab1,tab2 where tab1.id=tab2.id(+);ID ID
---------- ----------
1
2 2
3 3
没有值可以“等联接”出来的字段为空值
学号 姓名
0001 小李
0002 小王
0003 小朱
0004 小黄
选课表
学号 课程
0001 高数
0002 线数
0004 英语
0005 电脑--左(外)联接
SELECT 学生表.*, 选课表.课程
FROM 学生表, 选课表
WHERE 学生表.学号 = 选课表.学号(+)
查询的结果是:
学号 姓名 课程
0001 小李 高数
0002 小王 线数
0003 小朱
0004 小黄 电脑
学生表.学号 = 选课表.学号(+)表示
学生表(也就是左边的表)所有行都会被返回
即使选课表中没有相应的行与学生表中的行匹配--右(外)联接
SELECT 学生表.*, 选课表.课程
FROM 学生表, 选课表
WHERE 学生表.学号(+) = 选课表.学号
查询的结果是:
学号 姓名 课程
0001 小李 高数
0002 小王 线数
0004 小黄 电脑
0005 电脑
学生表.学号(+) = 选课表.学号表示
选课表(也就是右边的表)所有行都会被返回
即使学生表中没有相应的行与选课表中的行匹配
不同的数据库系统对外联接有不同的表示
有此根本不兼容如(还是以上例为基础)MS SQL SERVER 外联接的SQL写法
--左(外)联接 - 第一种写法
SELECT 学生表.*, 选课表.课程
FROM 学生表, 选课表
WHERE 学生表.学号 *= 选课表.学号
--左(外)联接 - 第二种写法
SELECT 学生表.*, 选课表.课程
FROM 学生表 LEFT OUTER JOIN 选课表 ON 学生表.学号 = 选课表.学号
--右(外)联接 - 第一种写法
SELECT 学生表.*, 选课表.课程
FROM 学生表, 选课表
WHERE 学生表.学号 =* 选课表.学号
--右(外)联接 - 第二种写法
SELECT 学生表.*, 选课表.课程
FROM 学生表 RIGHT OUTER JOIN 选课表 ON 学生表.学号 = 选课表.学号
--注:在MS SQL SERVER中,OUTER关健字可以省略ACCESS 外联接的SQL写法
--左(外)联接 - 第二种写法
SELECT 学生表.*, 选课表.课程
FROM 学生表 LEFT OUTER JOIN 选课表 ON 学生表.学号 = 选课表.学号
--右(外)联接 - 第二种写法
SELECT 学生表.*, 选课表.课程
FROM 学生表 RIGHT OUTER JOIN 选课表 ON 学生表.学号 = 选课表.学号
--注:在ACCESS中,关健字OUTER不可以省略ORACLE 外联接的SQL写法
--左(外)联接 - 第一种写法
SELECT 学生表.*, 选课表.课程
FROM 学生表, 选课表
WHERE 学生表.学号 = 选课表.学号(+)
--右(外)联接 - 第一种写法
SELECT 学生表.*, 选课表.课程
FROM 学生表, 选课表
WHERE 学生表.学号(+) = 选课表.学号ORACLE直到9i才支持SQL-92外联接语法
LEFT (OUTER)JOIN和RIGHT (OUTER) JOIN
和MS SQL SERVER一样
关健字OUTER是可以省略的
RIGHT OUTER JOIN—This returns all the rows from the table on the right side of the join, along with the values from the left-hand side, or nulls if a matching row doesn't exist.
FULL OUTER JOIN—This returns all rows from both tables, filling in any blanks with nulls. There is no equivalent for this in Oracle8i.