2010-08-05 179 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