日期:2014-05-17  浏览次数:20748 次

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就有问题了。
引用:
msg_no不是b表的字段,单独执行肯定报错。
之所以SELECT * FROM A WHERE A.SERV_ID IN(SELECT MSG_NO FROM B) 这样不报错,是因为子查询的关系,括号里面引用的字段是a的字段,相当于1=1,所以,返回A的全部数据了。
如果b表为空,则返回0条记录

------其他解决方案--------------------
引用:
直接上例子:
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字段不存在,但是为什么整句运行时不会报错呢?
虽然我知道是自己偷……

很明显啊,msg_no就不是B表的,单独运行当然出错了,
当时整个语句运行时,因为A表中有msg_no啊,所以虽然没报错,但也起不了什么作用吧!
------其他解决方案--------------------
局部调用全局 木问题  在子查询里面可以自动识别和调用主表里面的字段
------其他解决方案--------------------
SELECT * FROM A WHERE A.SERV_ID IN(SELECT SERV_ID FROM B)