1

以下のクエリを実行し、すべての列にエイリアス名を使用しています。. でエイリアスに名前を付けました。それが要件だからです。ここで、where 句でエイリアス名を直接参照したいのですが、次のようにします。

SELECT pt.prod_desc AS"PROD_DESC",
 (
CASE
WHEN pt.prod_level='2'
THEN 'Product'
WHEN pt.prod_level='4'
THEN 'Sub-Product'
WHEN pt.prod_level='5'
THEN 'Service'
ELSE 'N/A'
 END)         AS"PROD_LEVEL",
prod_id      AS "PROD_ID",
isactive     AS "IsActive",
updt_usr_sid AS "UPDT_USR_SID",
updt_ts      AS "UPDT_TS",
(
CASE
WHEN pt.prod_level='5'
THEN parent_prod_id
ELSE NULL
  END) AS ".SUB_PROD_ID",
(
 CASE
  WHEN pt.prod_level='5'
  THEN
  (SELECT prod_desc FROM dims_prod_type A WHERE A.prod_id= pt.parent_prod_id
  )
  ELSE 'N/A'
 END ) AS ".SUB_PROD_DESC",
 (
CASE
WHEN pt.prod_level='4'
THEN parent_prod_id
WHEN pt.prod_level='5'
THEN
  (SELECT parent_prod_id
  FROM dims_prod_type A
  WHERE A.prod_id= pt.parent_prod_id
   )
 ELSE NULL
   END) AS ".PRNT_PROD_ID",
(
 CASE
 WHEN pt.prod_level='4'
THEN
   (SELECT prod_desc FROM dims_prod_type A WHERE A.prod_id=pt.parent_prod_id
   )
  WHEN pt.prod_level='5'
THEN
   (SELECT prod_desc
   FROM dims_prod_type A
  WHERE A.prod_id IN
    (SELECT B.parent_prod_id
    FROM dims_prod_type B
    WHERE b.prod_id=pt.parent_prod_id
    )
  )
 ELSE 'N/A'
 END)AS ".PRNT_PROD_DESC"
FROM dims_prod_type pt
WHERE pt.".PRNT_PROD_ID" like 'A%';

ただし、これを実行すると、次のエラーが発生します。

    SQL Error: ORA-00904: "PT".".PRNT_PROD_ID": invalid identifier
     00904. 00000 -  "%s: invalid identifier"

SQL が最初に where 句を実行することを知っているため、それがエラーの原因です。しかし、どうすればこれを修正できますか? 何か提案はありますか?

4

3 に答える 3

2

句でエイリアスを使用できないことはwhere既にわかっていますが、それは同じレベルの SQL にのみ適用されます。クエリを外側のクエリでラップできます。

SELECT *
FROM (
  SELECT pt.prod_desc AS"PROD_DESC",
  ...
   END)AS ".PRNT_PROD_DESC"
  FROM dims_prod_type pt
)
WHERE ".PRNT_PROD_ID" like 'A%';

唯一の代替手段は、節でcaseその列を生成する全体を繰り返すことですが、これは非常に複雑なものでは不快です。where

于 2014-02-05T08:12:26.120 に答える
1

クエリをサブクエリに入れると、where 句でエイリアスを参照できます。次に例を示します。

SELECT * FROM (
  SELECT pt.prod_desc AS"PROD_DESC",
   ...etc...
  FROM dims_prod_type pt) pt
WHERE pt.".PRNT_PROD_ID" like 'A%';
于 2014-02-05T08:11:36.183 に答える
0

"PT".".PRNT_PROD_ID" を "PT"."PRNT_PROD_ID" に置き換えるか、pt.prnt_prod_id による理解を深めるために

于 2014-02-05T07:50:06.023 に答える