2010-08-05 183 views
3

我有两个表,名为t_master和t_detail。SQL从主选择 - 详细信息表

t_detail表中的数据对应于主表上的记录。 t_master

ID Brand 
1 Toyota 
2 Honda 

数据为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 

现在,我想打一个查询,应在主表,并在同一时间选择所有的行

数据,选择具有最新ID(最大)的细节,即

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

感谢您的帮助。谢谢。

回答

7

用途:

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

请注意,如果你在主表多行和有在适合详细信息表中没有行,但你还是要显示所有主表中的行,那么你应启动以下:

(请注意,您必须对2个行添加到主表) 例如:

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 - - - 

然后执行以下选择(有点不同的语法为了便于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

注意'(+)'有利于明确'留下join'的已被否决 – Vadzim 2014-07-11 14:30:29