2013-02-04 79 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(當你有一個外鍵約束時它也可以工作)。