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

将子查询中的别名更改为 sayPC2至少会使查询在逻辑上更易于阅读。

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

我很惊讶 oracle 可以计算出连接,因为两个别名都是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 回答