ORACLE中sql语句问题,求答案
直接上例子:
table A,字段:MSG_NO,SERV_ID,SERV_NAME
table B,字段:SERV_ID,SERV_DESC
sql语句:SELECT * FROM A WHERE A.SERV_ID IN(SELECT MSG_NO FROM B)返回的是A表全量
单独运行括号内的sql,提示MSG_NO字段不存在,但是为什么整句运行时不会报错呢?
虽然我知道是自己偷懒导致的,但是括号内不是相当于一个独立存在的sql么?
[最优解释]
msg_no不是b表的字段,单独执行肯定报错。
之所以SELECT * FROM A WHERE A.SERV_ID IN(SELECT MSG_NO FROM B) 这样不报错,是因为子查询的关系,括号里面引用的字段是a的字段,相当于1=1,所以,返回A的全部数据了。
如果b表为空,则返回0条记录
[其他解释]
SELECT * FROM A WHERE A.SERV_ID IN(SELECT MSG_NO FROM B)
单独执行里边的语句报错是因为B表中没有那个字段
全部执行没问题是因为A表的字段在子查询中也有效
就好比 括号外边的是全局变量 括号内部的是局部变量
全局变量在局部当然也可见
[其他解释]
这个说法是对的,子查询可以使用外层查询的字段的,当然也是你这种隐式用法才会出现的问题,你要改成B.MSG_NO就有问题了。