1

これはオラクルにあります。実際に解決できるかどうかわからない問題があります。しかし、本質的にいくつかの異なるフィールドを比較し、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')

私は元々、2 つの部分文字列名を条件として使用しようとしましたが、それも機能しませんでした。ここで何が間違っていますか?

4

1 に答える 1

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) = ...

関連している

于 2012-12-21T18:54:52.873 に答える