两段近似的SQL,执行情况却不大相同?

jiangshachina 2010-09-18 06:52:06
SQL A:
select * from tableA
where exists (select * from tableA a, tableB b where a.pk_a=b.pk_a and tableA.pk_x=a.pk_x)

SQL B:
select * from tableA
where exists (select * from tableA a inner join tableB b on a.pk_a=b.pk_a and tableA.pk_x=a.pk_x)

在Oracle10g中执行上述两段语句,发现SQL A能够正常执行,但执行SQL B时,却报找不到字段tableA.pk_x。
请问,如何解释这一现象?

另,上述两段代码在SQL Server中均能够正常执行。
...全文
134 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
minitoy 2010-09-19
  • 打赏
  • 举报
回复
不符合语法.应该写成这样.on的条件只能是inner join table之间的关联条件.
SQL> select * from emp
2 where exists (select * from emp a inner join dept b on a.deptno=b.deptno where emp.deptno=a.deptno);

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
7902 FORD ANALYST 7566 1981-12-3 3000.00 20
7876 ADAMS CLERK 7788 1987-5-23 1100.00 20
7788 SCOTT ANALYST 7566 1987-4-19 3000.00 20
7566 JONES MANAGER 7839 1981-4-2 2975.00 20
7369 SMITH CLERK 1000 1980-12-17 800.10 20
7900 JAMES CLERK 7698 1981-12-3 950.00 30
7844 TURNER SALESMAN 7698 1981-9-8 1500.00 0.00 30
7698 BLAKE MANAGER 7839 1981-5-1 2850.00 30
7654 MARTIN SALESMAN 7698 1981-9-28 1250.00 1400.00 30
7521 WARD SALESMAN 7698 1981-2-22 1250.00 500.00 30
7499 ALLEN SALESMAN 7698 1981-2-20 1600.00 300.00 30
7934 MILLER CLERK 7782 1982-1-23 1300.00 10
7839 KING PRESIDENT 1981-11-17 5000.00 10
7782 CLARK MANAGER 7839 1981-6-9 2450.00 10

14 rows selected
jiangshachina 2010-09-19
  • 打赏
  • 举报
回复
别名应该不关键,那个条件放在where子句中才是要紧。
谢谢大家的帮助。
虫洞 2010-09-18
  • 打赏
  • 举报
回复
有那么复杂吗

如果要比较tablea是否存在tableb

select * from tableA a
where exists (select * from tableB b where a.pk_a=b.pk_a );
就行,或者直接内连接

如果一定要在exists用2个表
只能用where,才可以跟外表关联

join 后的on和and条件 只能引用 join两边的表

select * from tableA c
where exists (select * from tableA a inner join tableB b on a.pk_a=b.pk_a where c.pk_x=a.pk_x)
;
mystep 2010-09-18
  • 打赏
  • 举报
回复
晕,跟着gelyon跑到这里来,呵呵。
gelyon 2010-09-18
  • 打赏
  • 举报
回复
你tableA 和tableB 是通过a.pk_a=b.pk_a连接的,要跟外层的tableA 连接就不能再用在inner join on下了,而要另外取别名或加where条件。
jiangshachina 2010-09-18
  • 打赏
  • 举报
回复
大家能从理论上解释这种情况吗?
huangdh12 2010-09-18
  • 打赏
  • 举报
回复
给外层的tableA 加个别名 然后再试试。。
iqlife 2010-09-18
  • 打赏
  • 举报
回复
tableA.pk_x=a.pk_x

这个条件多余的啊
gelyon 2010-09-18
  • 打赏
  • 举报
回复

select * from tableA c
where exists (select * from tableA a inner join tableB b on a.pk_a=b.pk_a where tableA.pk_x=a.pk_x);
wuyisky84 2010-09-18
  • 打赏
  • 举报
回复
tableA 换成别名 a 试试

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧