2

ステートメントで adecodeのエイリアスを使用しようとすると、タイトルに記載されているエラーが発生します。selectコードは次のとおりです。

SELECT DISTINCT rl.complaint_date, 
                  decode(rl.judgement_date,null,rl.complaint_amt,rl.judgement_amt) as account_amt, 
                  rl.date_served1, 
                  rl.date_served2,
                  rl.judgement_date,         
                  rl.skip_locate,
                  rl.case_no,
                  lcc.bal_range_min, 
                  lcc.bal_range_max, 
                  lcc.cost_range_min, 
                  lcc.cost_range_max, 
                  lcc.court,
                  lcc.county AS lcc_county,
                  ah.ACCOUNT, 
                  ah.transaction_code, 
                  ah.transaction_date, 
                  ah.rule_id, 
                  ah.amount, 
                  ah.description,                    
                  r.state, 
                  r.zip_code, 
                  z.county AS ah_county,
                  z.county_2,
                  z.county_3,
                  z.county_4
  FROM legal_address_skip las,
       racctrel r, 
       ziplist z, 
       legal_court_cost lcc, 
       racctlgl rl,
       legal_transaction_review ah
  WHERE ah.ACCOUNT = rl.ACCOUNT
  AND ah.ACCOUNT = las.ACCOUNT(+)
  AND ah.ACCOUNT = r.ACCOUNT
  AND nvl(lpad(substr(r.zip_code,0,instr(r.zip_code,'-')-1),5,0), substr(r.zip_code,1,5)) = z.zip 
  AND r.state = lcc.state
  AND (REPLACE(lcc.county,' ','') = REPLACE(upper(z.county),' ','') 
       OR REPLACE(lcc.county,' ','') = REPLACE(upper(z.county_2),' ','')
       OR REPLACE(lcc.county,' ','') = REPLACE(upper(z.county_3),' ','')
       OR REPLACE(lcc.county,' ','') = REPLACE(upper(z.county_4),' ',''))
  AND lcc.transaction_code = ah.transaction_code
  AND lcc.transaction_code = 1
  AND lcc.end_date IS NULL
  AND ah.amount NOT BETWEEN lcc.cost_range_min AND lcc.cost_range_max
  AND (account_amt NOT BETWEEN lcc.bal_range_min AND lcc.bal_range_max
      OR lcc.bal_range_min - account_amt NOT BETWEEN 0 AND 500)
  ORDER BY CASE 
           WHEN ah.amount NOT BETWEEN lcc.cost_range_min AND lcc.cost_range_max THEN 1
           WHEN ah.amount BETWEEN lcc.cost_range_min AND lcc.cost_range_max THEN 2 END, ah.amount;

以前にselectステートメントでエイリアスを使用したことがあるので、なぜこれでエラーが発生するのか混乱しています。この状況では、動作が異なりますか?

4

2 に答える 2

6

ドキュメントから(強調を追加):

列エイリアス を使用c_aliasして、選択リストの直前の式にラベルを付け、列が新しい見出しで表示されるようにすることができます。エイリアスは、クエリの期間中、選択リスト項目の名前を効果的に変更します。エイリアスは句で使用できますが ORDER BY、クエリの他の句では使用できません。

したがって、句でエイリアスを参照することはできませんwhere。現時点では次のとおりです。

...
AND (account_amt NOT BETWEEN ...
...

その時点でエイリアスは有効ではないため、いずれかのテーブルでその名前の列を探していますが、見つかりません。中でもいいorder byですけどね。

エイリアスを繰り返しステートメントに置き換えるかdecode、サブクエリを使用しwhereて外部クエリの句でエイリアスを参照する必要がありますが、他の条件の選択性によっては効率が低下する可能性があります。

于 2013-09-30T15:14:53.067 に答える
5

Oracle は、次の順序で選択クエリを実行します。

  1. FROM 句
  2. WHERE句
  3. GROUP BY 句
  4. HAVING 句
  5. SELECT句
  6. ORDER BY 句

上記に基づいて、WHERE 部分にいるときは、エイリアスがまだ作成されていないことがわかります。SELECT 部分の結果を使用したい場合は、次のようにクエリを変更して実行できます。

WITH q AS 
(
-- Your query without the extra AND
)
SELECT *
FROM q
WHERE --put your check here

このようにして、WHERE 部分に到達した時点で既にエイリアスが使用可能になっています。

お役に立てれば!:)

于 2013-09-30T15:25:30.200 に答える