2013-02-04 3 views

답변

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 

또는

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

감사합니다. 매우 좋은 – 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 

나는 놀라지 오라클은 모두 별명이 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

오라클은'TOP'를 지원하지 않습니다 –

+0

감사합니다. 오라클 플레이 어로 업데이트되었습니다. –

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을 사용하는 것이 더 좋습니다 (외래 키 제약 조건이있을 때도 작동합니다).