Oracle数据库数据恢复、性能优化

找回密码
注册
搜索
热搜: 活动 交友 discuz
发新帖

12

积分

0

好友

1

主题
1#
发表于 2012-4-16 19:10:12 | 查看: 5810| 回复: 3
两个表表1:employees                                    表2:departments
字段:                                                   字段:
      employeeid                                            departmentid
      name                                                    departmentname
      sex                                                       note
      departmentis
     birthday                                       

查找财务部年龄不低于所有研发部雇员年龄的雇员的姓名:
sql语句:
       select name from employees where
  departmentid in
  (select departmentid from departments where
   departmentname='财务部')
  and
birthday <= all
            (select birthday from employees
             where departmentid in
              (select departmentid from departments
               where departmentname='研发部'));

问题:1.birthday是一个集合吗?
         2.我的想法是birthday=(select birthday from employees where departmentid in (select departmentid from departments
                                       where departmentname='财务部'))
          但是用()里面的语句去比较的话肯定出错了,因为()里面select出来的是一个集合,但是为什么用一个‘birthday’就可以了呢?
            如果不这样的话,难道用集合来比较?那会是很麻烦的。反正卡在这里,不知道oracle是怎么辨析这个'birthday'的?
2#
发表于 2012-4-16 22:37:20
1 . 不是 birthday <= all 只是一个 谓词predicate , birthday 是一个谓词列

birthday  <= all( 元素A,元素B,元素c)  是列表(list)形式的 ALL 谓词
birthday  <=all (select * from .....)       是子查询(subquery)形式的ALL谓词


2.

ALL

The ALL comparison condition is used to compare a value to a list or subquery. It must be preceded by =, !=, >, <, <=, >= and followed by a list or subquery.

When the ALL condition is followed by a list, the optimizer expands the initial condition to all elements of the list and strings them together with AND operators, as shown below.

我们来看一个例子



SQL>  oradebug setmypid;
Statement processed.
SQL> oradebug event 10053 trace name context forever,level 1;
Statement processed.



select empno, sal
      FROM scott.emp
  WHERE sal <= all (SELECT e2.sal FROM scott.emp e2 WHERE e2.deptno = 20);
  
  

     EMPNO        SAL
---------- ----------
      7369        800
         
优化器会把以上<=ALL的语句 装换成下面的  NOT EXISTS的形式         


SELECT /*+ */ "SYS_ALIAS_1"."EMPNO" "EMPNO","SYS_ALIAS_1"."SAL" "SAL" FROM
"SCOTT"."EMP" "SYS_ALIAS_1"
WHERE  NOT EXISTS (SELECT /*+ */ 0 FROM "SCOTT
"."EMP" "E2" WHERE "E2"."DEPTNO"=20 AND LNNVL("E2"."SAL">="SYS_ALIAS_1"."SAL"))

回复 只看该作者 道具 举报

3#
发表于 2012-4-16 22:57:17
学习!!!!!!!!

回复 只看该作者 道具 举报

4#
发表于 2012-4-16 23:26:24
SQL> select id1 from a;

       ID1
----------
         1
         2
         4
         7
         9
        17
        89
       106
       196

已选择9行。

SQL> select id1 from a where id1<= all(20,50,100);

       ID1
----------
         1
         2
         4
         7
         9
        17

已选择6行。

意思是小于等于 括号里的最小值。

你的birthday 是个字段。


你那个sql得出来 的结果是          查找财务部年龄     不高于     所有研发部雇员年龄的雇员的姓名:

如果你想    不低于   要用   >=

回复 只看该作者 道具 举报

您需要登录后才可以回帖 登录 | 注册

QQ|手机版|Archiver|Oracle数据库数据恢复、性能优化

GMT+8, 2024-11-15 11:15 , Processed in 0.047059 second(s), 21 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部
TEL/電話+86 13764045638
Email service@parnassusdata.com
QQ 47079569