突然遇到一个很奇怪的问题,详细如下:
select subs_id from cust;cust表中没有subs_id字段所以会报出“subs_id invalid identifier”的错误。但是select * from subs where subs_id in (select subs_id from cust@link_cc);
却能正确执行,且得到了subs表中的全部记录。 注: subs表主键就是subs_id。问题就是很奇怪,单独执行 select subs_id from cust;会报错,这我理解,cust表中根本就没有subs_id属性字段嘛。
但是怎么放到一个in从句中就行了呢?还不报错?在网上找了半天也没有答案,难道是SQL的bug,这是在ORACLE10g中试验的。望高手解答。
select subs_id from cust;cust表中没有subs_id字段所以会报出“subs_id invalid identifier”的错误。但是select * from subs where subs_id in (select subs_id from cust@link_cc);
却能正确执行,且得到了subs表中的全部记录。 注: subs表主键就是subs_id。问题就是很奇怪,单独执行 select subs_id from cust;会报错,这我理解,cust表中根本就没有subs_id属性字段嘛。
但是怎么放到一个in从句中就行了呢?还不报错?在网上找了半天也没有答案,难道是SQL的bug,这是在ORACLE10g中试验的。望高手解答。
解决方案 »
- group by的初级问题,迷惑中,求解
- oracle 字符串的分割
- ORA-01427的错误发生后如何查到那些返回多条记录的数据
- 如何从 blob 读出的 16进制 变成 字符,再 insert 到 指定的表中
- 哪位大侠有PL/SQL的资料啊?本人今晚急需
- 已经配置了Oracle Management Server,为什么还是不能登录到Oracle Management Server?
- 在连接数据库是出现以下提示:没有发现 Oracle 客户端和网络组件。这些组件由 Oracle 公司提供,是 Oracle 7.3.3版(或更新)客户端软件安装
- 急!!!在线求救一个关于视图访问速度的问题
- sql语句问题
- 帮我看看这个问题错在哪?
- oracle分页奇怪的问题
- 请教oracle存储过程执行死了,没反应了,谢谢!
select * from subs where subs_id in (select subs_id from cust@link_cc);
应该是
select * from subs where subs_id in (select subs_id from cust;
第二个语句相当于
select * from subs where subs_id in (select subs.subs_id from cust)
语法解析的时候,没有在cust表中找到subs_id,就取了subs表中的对应字段
你可以试试将子查询里的cust表改成dual,照样能够执行,这个查询已经不能对记录进行过滤
大家不要再从@link_cc上多思考了,与链接没关系的,都是同一个数据库实例,开始我写的cust@link_cc
是手误。压根就没有@link_cc 的
为什么会是这种逻辑呢?如果第二个语句相当于:
select * from subs where subs_id in (select subs.subs_id from cust);
在cust中找不到subs_id,那应该相当于是null啊,整个句子就应该相当于:
select * from subs where subs_id in null;
这样才合理啊
----------
1OPER@XE> select * from test2; BBB
----------
1
2OPER@XE> set autot on explain
OPER@XE> select * from test2 where bbb in(select bbb from test); BBB
----------
1
2
执行计划
----------------------------------------------------------
Plan hash value: 3707675100-----------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-----------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 2 | 26 | 4 (0)| 00:00:01 |
|* 1 | FILTER | | | | | |
| 2 | TABLE ACCESS FULL | TEST2 | 2 | 26 | 2 (0)| 00:00:01 |
|* 3 | FILTER | | | | | |
| 4 | TABLE ACCESS FULL| TEST | 1 | | 2 (0)| 00:00:01 |
-----------------------------------------------------------------------------Predicate Information (identified by operation id):
--------------------------------------------------- 1 - filter( EXISTS (SELECT /*+ */ 0 FROM "TEST" "TEST" WHERE
:B1=:B2))
3 - filter(:B1=:B2)in部分转换为:
SELECT 0 FROM "TEST" "TEST"
如果你希望按你想的那样查询,在字段名前面显式地加上表名:
select * from subs where subs_id in (select cust.subs_id from cust)
这个应该就会按你预想的那样报错了..
如果:你把子查询的cust别名,再把subs_id改为别名.cust之后就肯定报错了