2009-03-18 4 views
2

테이블을 가지고 있고 다른 테이블을 외부 조인하고 Oracle 10g를 사용하여 두 번째 테이블의 첫 번째 행 (가장 낮은 nr을 가진 행) 만 가져 오려고합니다.oracle을 사용하여 외부 조인에서 단 하나의 행 가져 오기

편집 : NR은 (빠른 테스트를 하나의 행으로 제한하지 않고 허용해야한다)

Table x Table y 
id   id nr code 
1   1 1 B 
2   1 2 A 
3   2 2 A 

Expected result: 
id nr  code 
1 1  B 
2 2  A 
3 NULL NULL 

예 테스트 데이터의 ID 내에서 고유 :

WITH 
    x AS(SELECT 1 id FROM dual UNION SELECT 2 FROM dual UNION SELECT 3 FROM dual), 
    y AS(SELECT 1 id, 1 nr, 'B' code FROM dual 
     UNION SELECT 1, 2, 'A' FROM dual 
     UNION SELECT 2, 2, 'A' FROM dual 
) -- end of test data 
SELECT x.id, y.nr, y.code 
    FROM x 
    LEFT OUTER JOIN y ON (y.id = x.id) 

답변

14
WITH 
    x AS(SELECT 1 id FROM dual UNION SELECT 2 FROM dual UNION SELECT 3 FROM dual), 
    y AS(SELECT 1 id, 1 nr, 'B' code FROM dual 
     UNION SELECT 1, 2, 'A' FROM dual 
     UNION SELECT 2, 2, 'A' FROM dual 
) -- end of test data 
SELECT * 
FROM (
     SELECT x.id, y.nr, y.code, ROW_NUMBER() OVER (PARTITION BY x.id ORDER BY y.nr) AS rn 
     FROM x 
     LEFT OUTER JOIN y 
     ON y.id = x.id 
) 
WHERE rn = 1 
+0

PARTITION BY의 DESC는 첫 번째 행을 가져 오려면 제거해야합니다. –

+0

어떤 이유로 나는 당신이 가장 높은 Y.NR을 필요로한다고 생각했습니다 :) 물론, 가장 낮은 것을 원한다면 DESC를 제거하십시오. – Quassnoi

+0

그냥 감사합니다. –

0
WITH 
    x AS(SELECT 1 id FROM dual UNION SELECT 2 FROM dual UNION SELECT 3 FROM dual), 
    y AS(SELECT 1 id, 1 nr, 'B' code FROM dual 
     UNION SELECT 1, 2, 'A' FROM dual 
     UNION SELECT 2, 2, 'A' FROM dual 
) -- end of test data 
SELECT x.id, y.nr, y.code 
    FROM x 
    LEFT OUTER JOIN y ON (y.id = x.id) 
WHERE rownum = 1 --Add this 
+0

@CoolMagma : Welcome to Stackoverflow! 게시하기 전에 미리보기를 사용하고 선행 공백이나 "코드 샘플"버튼을 사용하여 코드 서식을 지정하십시오. –

관련 문제