嵌套的带有多个子串的SELECT语句的问题,Oracle

时间:2012-12-21 18:53:00

标签: sql oracle nested substring identifier

这是在Oracle中。我遇到了一个我不确定实际可以解决的问题。但是我创建了一个查询,它基本上比较了几个不同的字段,并且需要能够利用2个子字符串列并将它们相互比较。我不太确定如何执行此操作,因为我尝试了以下代码块,并且我不断收到“无效标识符”错误或“单行子查询返回多行”。我知道后者出现的原因并不是问题所在。我想弄清楚为什么我的子串列不能相互比较。

代码示例:

这个给了我正确的列,所以我知道它不是语法。

select substr(p.new_plan, 1, 1) as np, substr(p.old_plan, 1, 1) as op 
from sbsb_plan_conv p, cmc_sbel_elig_ent e
where p.sbsb_ck = e.sbsb_ck

这是完整的代码块,它给出了“OP”:无效的标识符错误

SELECT p.cspi_id, p.sbel_eff_dt, co.new_plan, co.ch_dt, co.sbsb_ck
FROM sbsb_plan_conv co, cmc_sbel_elig_ent p
WHERE co.ch_dt > p.SBEL_EFF_DT
AND co.new_plan <> p.CSPI_ID
AND co.sbsb_ck = p.sbsb_ck
AND p.cspi_id   = co.OLD_PLAN
and (p.cspd_cat = (
          select substr(o.old_plan, 1, 1) as op  
          from sbsb_plan_conv o, cmc_sbel_elig_ent e
          where op = (
                select substr(q.new_plan, 1, 1) as np   
                from sbsb_plan_conv q, cmc_sbel_elig_ent w
                where q.sbsb_ck = w.sbsb_ck)
          and o.sbsb_ck = e.sbsb_ck)
or p.cspd_cat = (
          select substr(o.new_plan, 1, 1) as np   
          from sbsb_plan_conv o, cmc_sbel_elig_ent e
          where np = (
                select substr(q.old_plan, 1, 1) as op  
                from sbsb_plan_conv q, cmc_sbel_elig_ent w
                where q.sbsb_ck = w.sbsb_ck)
          and o.sbsb_ck = e.sbsb_ck)
            )
AND (p.SBEL_ELIG_TYPE = 'tm'
OR p.sbel_elig_type = 'ce'
OR p.SBEL_ELIG_TYPE = 'TM'
OR p.sbel_elig_type = 'CE')

我最初尝试使用两个子字符串名称作为条件,但也不起作用。我在这里做错了什么?

1 个答案:

答案 0 :(得分:1)

您不能使用同一查询的where子句中select子句中定义的别名。

改变这个:

select substr(o.old_plan, 1, 1) as op  
from sbsb_plan_conv o, cmc_sbel_elig_ent e
where op = ...

对此:

select substr(o.old_plan, 1, 1) as op  
from sbsb_plan_conv o, cmc_sbel_elig_ent e
where substr(o.old_plan, 1, 1) = ...

相关