Oracle 相关子查询
2015-06-19 12:13
501 查看
-- Start
我们先来看两个表的定义:
大家对子查询都非常熟悉,可是我发现,很多人都不知道子查询有两种格式:一种是相关子查询(Correlated Sub-Query),另一种是非相关子查询(Uncorrelated Sub-Query)。下面我们通过一个例子来对比一下这两种子查询的不同。假设现在让你查询一下公司电话是88888888 的用户有哪些,我们可以使用如下语句:
以上两条语句的用作是相同的,对比后我们发现,相关子查询的子句(也就是括号中的语句:ELECT * FROM COMPANY C WHERE TELNO='88888888' AND U.COMPANYID=C.COMPANYID)依赖外部语句的条件,不能单独执行;而非相关子查询的子句是可以单独执行的。就以上这个例子来说,我们使用相关子查询无论从性能和可读性都不如非相关子查询,下面我们来看一个使用非相关子查询办不到的例子,假设现在让你把用户电话更新成公司电话,怎么办?有些人可能采用如下的方式构造update sql,然后执行,如下:
这么做是可以的,但是有点笨(当然,自己觉得挺聪明,因为他可能觉得自己使用了别人不常用或不知道的using sql to make sql),我们还有更好的方法,就是采用相关子查询,如下所示:
怎么样?是不是感觉自己很厉害,有没有更简单的办法?看看下面的语句吧。
--更多参见:Oracle SQL 精萃
-- 声明:转载请注明出处
-- Last edited on 2015-06-19
-- Created by ShangBo on 2015-06-19
-- End
我们先来看两个表的定义:
--用户 CREATE TABLE EMPLOYEE ( USERID NUMBER(9,0) NOT NULL,---用户ID COMPANYID NUMBER(9,0),---公司ID TELNO VARCHAR2(12)---用户电话 ); ALTER TABLE "EMPLOYEE" ADD CONSTRAINT "PK_EMPLOYEE" PRIMARY KEY ("USERID"); --公司 CREATE TABLE COMPANY ( COMPANYID NUMBER(9,0) NOT NULL,---公司ID TELNO VARCHAR2(12)---公司电话 ); ALTER TABLE "COMPANY" ADD CONSTRAINT "PK_COMPANY" PRIMARY KEY ("COMPANYID");
大家对子查询都非常熟悉,可是我发现,很多人都不知道子查询有两种格式:一种是相关子查询(Correlated Sub-Query),另一种是非相关子查询(Uncorrelated Sub-Query)。下面我们通过一个例子来对比一下这两种子查询的不同。假设现在让你查询一下公司电话是88888888 的用户有哪些,我们可以使用如下语句:
--非相关子查询(Uncorrelated Sub-Query) SELECT * FROM EMPLOYEE WHERE COMPANYID IN ( SELECT COMPANYID FROM COMPANY WHERE TELNO='88888888' ); --相关子查询(Correlated Sub-Query) SELECT * FROM EMPLOYEE U WHERE EXISTS ( SELECT * FROM COMPANY C WHERE TELNO='88888888' AND U.COMPANYID=C.COMPANYID );
以上两条语句的用作是相同的,对比后我们发现,相关子查询的子句(也就是括号中的语句:ELECT * FROM COMPANY C WHERE TELNO='88888888' AND U.COMPANYID=C.COMPANYID)依赖外部语句的条件,不能单独执行;而非相关子查询的子句是可以单独执行的。就以上这个例子来说,我们使用相关子查询无论从性能和可读性都不如非相关子查询,下面我们来看一个使用非相关子查询办不到的例子,假设现在让你把用户电话更新成公司电话,怎么办?有些人可能采用如下的方式构造update sql,然后执行,如下:
SELECT 'UPDATE EMPLOYEE SET TELNO=''' || TELNO || ''' WHERE COMPANYID=' || CHAR(COMPANYID) || ';' FROM COMPANY
这么做是可以的,但是有点笨(当然,自己觉得挺聪明,因为他可能觉得自己使用了别人不常用或不知道的using sql to make sql),我们还有更好的方法,就是采用相关子查询,如下所示:
UPDATE EMPLOYEE U SET TELNO= ( SELECT TELNO FROM COMPANY C WHERE U.COMPANYID=C.COMPANYID );
怎么样?是不是感觉自己很厉害,有没有更简单的办法?看看下面的语句吧。
UPDATE ( SELECT U.TELNO EMPLOYEE_TELNO, C.TELNO COMPANY_TELNO FROM EMPLOYEE U, COMPANY C WHERE U.COMPANYID=C.COMPANYID ) SET EMPLOYEE_TELNO = COMPANY_TELNO;
--更多参见:Oracle SQL 精萃
-- 声明:转载请注明出处
-- Last edited on 2015-06-19
-- Created by ShangBo on 2015-06-19
-- End
相关文章推荐
- Oracle VM VirtualBox +ubuntu server 搭建虚拟服务器局域网
- Oracle--常见Exception
- Oracle同义词创建及其作用
- oracle在schema是什么意思?
- 恢复oracle中误删除drop掉的表
- oracle ORA-01000: maximum open cursors exceeded问题的解决方法
- Oracle 数据库安装
- Oracle 执行计划查看方式
- Oracle停掉一个正在运行的job
- oracle 表查询(1)
- ORACLE定期清理INACTIVE会话
- oracle 表的管理(数据类型,表创建删除,数据CRUD 操作)
- Oracle 常见等待事件
- Oracle 空间管理
- Oracle 索引
- Oracle中使用profile管理用户口令
- oracle分页查询
- Oracle用户管理
- Oracle 查找带有CLOB字段的所有表
- 大小中型数据库和Oracle的常用命令