2010-09-08 15 views
0

J'ai une grande déclaration:Oracle joindre externe gauche: demandes limites howto dans le tableau à droite

SELECT 
    a.user_id, a.user_name, 
    s.name, s.value, 
    d.default 
FROM 
    accounts a, 
    settings s 
    LEFT OUTER JOIN default d ON (d.name = s.name) 
WHERE 
    s.user_id = a.user_id; 

Le problème est que settings contient une grande quantité d'entrées et je dois choisir celui avec le plus grand ID. Je peux imaginer changer l'instruction et remplacer la jointure par une sous-sélection (qui saisit l'entrée correcte de settings), mais je suis curieux de voir s'il y a une meilleure solution. Toute contribution est appréciée. Merci beaucoup!

Répondre

0

Vous pouvez utiliser une sous-requête pour obtenir uniquement les résultats souhaités dans la bonne table.

Quelque chose comme:

SELECT 
    * 
FROM 
    accounts a, 
    (
     SELECT 
      user_id, 
      * 
     FROM 
      settings 
     WHERE 
      RANK() OVER (ORDER BY id DESC, PARTITION BY user_id) = 1 
    ) s 
+0

fonction fenêtré ne peut pas être utilisée dans la clause WHERE. –

+0

Oh, vraiment? Ok, dans un sous sélectionner, 1 sec. –

-1

obtenir le plus haut ID d'une table pourrait être fait avec un

select max(id) ... 

ou avec un

select id from settings where rownum=1 order by id desc 

(je préfère la première solution) ou tout comme John proposé, mais vous aurez besoin d'une sous-requête de toute façon. une chose, il pourrait y avoir une faute de frappe dans votre exemple, je ne vois pas où d vient, ni le point de faire une auto gauche rejoindre ...

Voici ce que je l'aurais écrit

SELECT 
    user_id, user_name, 
    name, value, 
    default 
FROM 
    accounts join 
    (select user_id,name 
    from settings 
    where RANK() OVER (ORDER BY id DESC, PARTITION BY user_id) = 1) using(user_id) 
    LEFT OUTER JOIN default using (name) 

... encore sous-requête

+0

Merci, corrigé l'exemple en ce qui concerne la table par défaut/d. – MrG

+0

ok J'ai ajouté mon essai ... –

+2

Votre dernière requête ne retournera pas de manière fiable les résultats attendus, car 'rownum = 1' sera évalué avant' order by user_id desc'. – Allan