ALL子句中的多个列

时间:2014-01-01 12:59:45

标签: sql oracle oracle11g

是否可以使用ALL子句的多个列。 请提供一些例子

我在HR shema上尝试了这个相关查询。


SELECT *
FROM   job_history j
WHERE  ( employee_id, job_id ) = ALL (SELECT employee_id, job_id
                                      FROM   employees e
                                      WHERE  e.employee_id = j.employee_id
                                             AND e.job_id = j.job_id) 

它不考虑内部查询和where条件。而不是它返回job_history表。

让我们假设表格

JOB_HISTORY

employee_id   job_id
-----------   ----------
102           IT_PROG,
101           AC_ACCOUNT

员工

employee_id   job_id
-----------   ----------
102           IT_PROG,

所以根据我的知识,查询应该只输出102 IT_PROG, 但它的输出是

employee_id   job_id
-----------   ----------
102           IT_PROG,
101           AC_ACCOUNT

这就是问题..

2 个答案:

答案 0 :(得分:0)

Oracle优化器在运行时使用EXISTS / NOT EXISTS更改ANY,ALL和SOME运算符,并在相关查询中移动过滤条件。我在其中一个site ...

上查了一个例子
SELECT e1.empno, e1.sal
FROM   emp e1
WHERE  e1.sal > ALL (SELECT e2.sal
                     FROM   emp e2
                     WHERE  e2.deptno = 20);

由编译器解释为

SELECT e1.empno, e1.sal
FROM   emp e1
WHERE  NOT EXISTS (SELECT e2.sal
                   FROM emp e2
                   WHERE e2.deptno = 20
                   AND   e1.sal <= e2.sal)

仍然不太确定,但可能是您提供的查询被解释为: -

原始查询:

SELECT *
FROM   job_history j
WHERE  ( employee_id, job_id ) = ALL (SELECT employee_id, job_id
                                      FROM   employees e
                                      WHERE  e.employee_id = j.employee_id
                                             AND e.job_id = j.job_id) 

Oracle解释(仅基于&gt;任何示例的猜测工作)

SELECT *
FROM   job_history j
WHERE  NOT EXISTS (SELECT employee_id, job_id
                                      FROM   employees e
                                      WHERE  e.employee_id = j.employee_id
                                             AND e.job_id = j.job_id
                                             and e.employee_id != j.employee_id
                                             AND e.job_id != j.job_id) 

但是,仍然有很长的路要探索ALL,ANY和SOME的实际解释。

无论如何,在我猜之前8i之前就已经使用了一些条款,现在它们被认为是过时的,尽管Oracle支持它们但是它们已被统计函数和其他查询数据的技术所接管。

答案 1 :(得分:-1)

必须是这样的:

SELECT *
FROM   job_history j
WHERE  ( employee_id, job_id ) =ANY (SELECT employee_id, job_id
                                      FROM   employees e
                                      WHERE  e.employee_id = j.employee_id
                                             AND e.job_id = j.job_id) 

=ANY的对面是<>ALL

x =ANY (SELECT ...)等于x IN (SELECT ...)

x <>ALL (SELECT ...)等于x NOT IN (SELECT ...)

然后你可以尝试这个:

SELECT *
FROM   job_history j
   JOIN employees e USING (employee_id, job_id)