5

Oracle dbに次のテーブルがあります。

元のテーブル

PARENT 列をそれに関連付けられた名前に変更する入れ子になった選択クエリを実行できますか? このような:

テーブルが欲しい

私が試してみました:

SELECT PC.ID
,(
  SELECT PC.NAME from PRODUCTS_CATEGORIES PC where PC.PARENT = PC.ID
 )
 ,PC.NAME
  FROM PRODUCTS_CATEGORIES PC 

このエラーが発生しました:

Error Message: ORA-01427: single-row sub query returns more than one row
4

3 に答える 3

5

あなたはこれを行うことができます

SELECT PC.ID,
(
   SELECT DISTINCT PC2.NAME from PRODUCTS_CATEGORIES PC2 
   where PC.PARENT = PC2.ID AND PC2.PARENT = 0
 ),
 PC.NAME
 FROM PRODUCTS_CATEGORIES PC 

また

 SELECT PC.ID,NVL(PC2.NAME,PC.PARENT) PC2_NAME,PC.NAME
  FROM PRODUCTS_CATEGORIES PC 
  LEFT OUTER JOIN 
  (SELECT DISTINCT ID, NAME 
  from PRODUCTS_CATEGORIES WHERE PARENT = 0) PC2 ON PC.PARENT = PC2.ID
于 2013-02-04T22:10:55.577 に答える
2
select pc.id,
       coalesce(pr.name, 'No Parent') as parent_name,
       pc.name
from products_categories pc
  left join products_categories pr on pc.parent = pr.id;

0親として保存することはあまり良い考えではないことに注意してください。parentこれは、列に外部キー制約が定義されていない可能性があることを示しています。これは必要です。親が存在しないことを示すには、使用することをお勧めしますNULL(これは、外部キー制約がある場合にも機能します)。

于 2013-02-04T22:57:27.937 に答える
0

サブクエリのエイリアスを say に変更するPC2と、少なくともクエリが論理的に読みやすくなります。

SELECT PC.ID
,(
  SELECT PC2.NAME from PRODUCTS_CATEGORIES PC2 where PC.PARENT = PC2.ID
 )
 ,PC.NAME
  FROM PRODUCTS_CATEGORIES PC 

両方のエイリアスがPC. それ以外は、彼は嘘をつきません - 一部の製品には複数の親があります。

気にしない場合は、最初の親を選択できます (それが実際に問題である場合)。

SELECT PC.ID
,(
  SELECT PC2.NAME from PRODUCTS_CATEGORIES PC2 where PC.PARENT = PC2.ID 
  AND ROWNUM <= 1
 )
 ,PC.NAME
  FROM PRODUCTS_CATEGORIES PC 
于 2013-02-04T22:06:10.053 に答える