是否可以使用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表。
让我们假设表格
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
这就是问题..
答案 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)