2010-08-05 5 views
3

J'ai deux tables, nommées t_master et t_detail.Sélection SQL à partir du maître - Tableaux de détail

Les données de la table t_detail correspondent à un enregistrement sur la table principale.

données de t_master

ID Brand 
1 Toyota 
2 Honda 

données pour le t_detail

DetID ParentID Model 
1  1  Corolla 2009 
2  1  Corolla 2010 
3  1  Corolla 2011 
4  2  Civic 2004 
5  2  Civic 2006 

Maintenant, je veux faire une requête qui devrait sélectionner toutes les lignes dans la table principale et en même temps, sélectionnez la détail qui a le dernier ID (max), à savoir

ID Brand DetID ParentID Model 
1 Toyota 3  1  Corolla 2011 
2 Honda 5  2  Civic 2006 

Appréciez votre aide. Merci.

Répondre

7

Utilisation:

SELECT m.id, 
     m.brand, 
     x.detid, 
     x.parentid, 
     x.model 
    FROM T_MASTER m 
    JOIN T_DETAIL x ON x.parentid = m.id 
    JOIN (SELECT d.parentid, 
       MAX(d.detid) AS max_detid 
      FROM T_DETAIL d 
     GROUP BY d.parentid) y ON y.max_detid = x.detid 
          AND y.parentid = x.parentid 
2
SELECT Make.ID, Make.Brand, Model.DetID, Model.Model 
FROM t_master Make 
    INNER JOIN t_detail Model ON Make.ID = Model.ParentID 
WHERE 
    DetID = 
    (
     SELECT MAX(DetID) From t_detail WHERE ParentID = Make.ID 
    ) 
0

S'il vous plaît noter que si vous avez plus de lignes dans la table principale et il n'y a pas de lignes dans le tableau détaillé qui correspond, mais vous voulez toujours afficher toutes les lignes de la table maître vous devrait lancer le ci-dessous:

(S'il vous plaît noter que vous devez ajouter 2 lignes à la table principale) par exemple:

ID Brand 
1 Toyota 
2 Honda 
3 Porsche 
4. Volvo 

In order to get the following result : 

ID BRAND DETID PARENTID MODEL 
1 Toyota 3 1 Corolla 2011 
2 Honda 5 2 Civic 2006 
4 Volvo - - - 
3 Porcshe - - - 

Ensuite, procédez comme suit select (un peu différente syntaxe pour la facilité des utilisateurs Oracle):

SELECT m.id, 
     m.brand, 
     x.detid, 
     x.parentid, 
     x.model 
FROM T_MASTER m, 
    T_DETAIL x, 
    (SELECT m.id,NVL(MAX(d.detid),1) AS max_detid 
     FROM T_DETAIL d, T_MASTER m 
     WHERE m.id = d.parentid (+) 
     GROUP BY m.id) y 
WHERE m.id = x.parentid (+) 
AND  y.max_detid = NVL(x.detid,1) 
     AND y.id = m.id 
+0

Notez que '(+)' a été dépréciée en faveur de 'explicite join' gauche – Vadzim

Questions connexes