2013-02-04 78 views
1

我对Oracle数据库的表:甲骨文嵌套select查询

Original table

我可以做嵌套父栏更改为与它关联的名称选择查询? 这样的:

Would like to have table

我曾尝试:

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 

回答

1

你可以做到这一点

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 

OR

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 
+2

'distinct'不保证只返回一行。 –

+0

感谢rs。工作很好 – ofir

+0

@a_horse_with_no_name,我不认为会有多个名称为相同的父母id。 –

0

子查询更改别名说PC2至少会令查询逻辑上更易于阅读。

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 
+0

oracle不支持'TOP' –

+0

@rs感谢更新到oracle风格 –

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(当你有一个外键约束时它也可以工作)。