2009-03-18 7 views
2

Ich habe eine Tabelle und möchte eine andere Tabelle external-Join, nur die erste Zeile (die mit der niedrigsten Nr) der zweiten Tabelle mit Oracle 10g.Nur eine Zeile in Outer-Join mit Orakel erhalten

Edit: nr ist einzigartig innerhalb einer ID

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 

Beispiel mit Testdaten (die Beschränkung auf einzelne Zeilen nicht tun soll aber schnelle Tests erlauben):

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) 

Antwort

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

Die DESC in PARTITION BY sollte entfernt werden, um die erste Zeile zu bekommen, oder? –

+0

Aus irgendeinem Grund dachte ich, Sie brauchen eine höchste Y.NR :) Sicher, entfernen Sie die DESC, wenn Sie die niedrigste – Quassnoi

+0

brauchen, was ich brauchte, danke. –

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: Willkommen bei Stackoverflow! Bitte verwenden Sie die Vorschau vor dem Posten und versuchen Sie, den Code mit führenden Leerzeichen oder der Schaltfläche "Codebeispiele" zu formatieren. –