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