2013-08-28 68 views
1

我有如下表:任何清潔劑或寫替代方法SQL連接腳本

Table2  
StudentNumbers ExamType 
------------------------ 
      1234   1 
      2343   2 
      3345   5 
      3454   1 
      5465   2 
      ... 

Table1 
StudentNumbers ExamType ExamDate School Area    Info 
------------------------------------------------------------------ 
      1234   1  0825 warren ny 0x504B03042D0 
      1234   1  0829 north nj 0x63D86E1FFFF 
      1233   2  0921 north nj 0xA001400646F 
      2343   1  0922 warren ny 0x01400646174 
      2343   1  0925 north ny 0x100100070se 
      ... 

我想編寫一個查詢得到以下結果:

StudentNumbers ExamType ExamDate School Area   Info 
----------------------------------------------------------------- 
      1234   1  0829 north nj 0x63D86E1FFFF 
      2343   1  0925 north ny 0x100100070se 

我寫了下面的查詢:

Select t1.StudentNumbers, t1.ExamDate, t1.School, t1.Info, t1.ExamType   
from Table1 as t1 
    Join(
     Select ts.StudentNumbers, max(ts.ExamDate) as ExamDate 
     from Table2 as ts 
     Join Table1 as pl on 
      ts.StudentNumbers = pl.StudentNumbers where ts.ExamType = pl.ExamType 
     group by ts.StudentNumbers 
     ) as t2 on t1.StudentNumbers = t2.StudentNumbers 
        and t1.ExamDate = t2.ExamDate 

上面的查詢工作,並給我我想要的結果是最大ExamDate基於表2的特定ExamType。但是在這個聚合方法中使用多個連接的最佳方式?或者有更清潔的選擇。

+1

嗯,我會說這是'ANSI SQL'的方式,這很好。您可能會根據您的dbms找到其他選項,但是...您不會告訴我們您使用哪一個。 –

+0

所以你的問題不是關於連接,而是「改善」/改變你的查詢? –

+1

btw ..你正在使用哪種DBMS? –

回答

0

您的查詢是好的,但我認爲使用子查詢外的Table2表將是更好的選擇。

SELECT * 
FROM (
     SELECT StudentNumbers, ExamType, MAX(ExamDate) AS ExamDate 
     FROM Table1 
     GROUP BY StudentNumbers, ExamType 
    ) t1 JOIN Table1 t2 ON t1.StudentNumbers = t2.StudentNumbers 
      AND t1.ExamType = t2.ExamType AND t1.ExamDate = t2.ExamDate 
WHERE EXISTS(
      SELECT 1 
      FROM Table2 t3 
      WHERE t1.StudentNumbers = t3.StudentNumbers 
       AND t1.ExamType = t3.ExamType 
      ) 
0
SELECT 
    t1.* 
FROM Table1 t1 
INNER JOIN Table2 t2 
ON t1.StudentNumbers = t2.StudentNumbers 
WHERE t1.ExamDate = (SELECT MAX(ExamDate) FROM Table1 WHERE StudentNumbers = t1.StudentNumbers) 
ORDER BY t1.StudentNumbers ASC 

可能不是最有效的解決方案,但。