查询中SUBSTR中的两个select语句

时间:2014-06-20 14:12:40

标签: sql oracle oracle11g oracle-sqldeveloper

当我单独运行以下sql查询时,我得到一个三字母值的正确结果

(select substr((select code from (select  qq.id, qq.code from contacts qq where qq.code like 'FB%' and qq.ref_no = 3359245 order by id desc ) where rownum=1),3,6) from dual)

但是当我以下列方式运行相同的查询时,

select ce.ref_no, 
(select substr((select code from (select  qq.id, qq.code from contacts qq where qq.code like 'FB%' and qq.ref_no = ce.ref_no order by id desc ) where rownum=1),3,6) from dual) "FEEDBACK"
from contacts ce
where ce.ref_no = 3359245;

我收到以下错误

ORA-00904: "CE"."REF_NO": invalid identifier
00904. 00000 -  "%s: invalid identifier"
*Cause:    
*Action:
Error at Line: 62 Column: 137

我的数据集如下:

14494895    FBBOM
14494896    FBDEL
14494897    FBBOM
14494898    FBDEL
14494902    FBDEL
14494903    FBDEL

我想从14494903获得FBDEL

2 个答案:

答案 0 :(得分:1)

使用相关子查询时,Oracle对如何使用相关子查询进行了限制。它识别外部查询。它只能降低一级。

关联条件有两个级别,因此编译器无法识别外部别名。

我认为您可以使用分析功能更轻松地完成您想要的任务。我想这就是你想要的:

select  ce.ref_no,
        substr(max(code) keep (dense_rank first order by (case when code like 'FB%' then 1 else 0 end) desc,
                                                          id desc
                              ), 3, 6)
from contacts ce
where ce.ref_no = 3359245
group by ce.ref_no;

这假设存在FB记录,因此在其他情况下可能会返回错误的内容。 (您可以使用其他逻辑来检查。)

答案 1 :(得分:0)

这是因为内部查询

不显示Contacts表,因此别名ce