2016-03-23 9 views
0

私は非常に基本的なSQL結合コンセプトについて助けが必要です。結合テーブルからMAX(日付)値を取得する

私は従業員テーブルとポジションテーブルを持っています。従業員テーブルはそうのようなものです:

EmpID Name 
1  Jane Jones 
2  Bob Smith 
3  Jim Adams 

位置テーブルは、このようなものです:

EmpID Name  Position DateFilled 
1  Jane Jones Sales  1/2/2012 
2  Bob Smith Sr. Mgmnt 7/5/2015 
3  Jim Adams IT Devel. 5/11/2015 

だから、他の言葉で、どのように:私は次の出力を得ることができますどのように

PosID EmpID  Position DateFilled 
1  1   Sales  1/2/2012 
2  2   HR   4/5/2013 
3  2   Mgmnt  6/1/2014 
4  2   Sr. Mgmnt 7/5/2015 
5  3   IT Support 4/6/2014 
6  3   IT Devel. 5/11/2015 

ポジションテーブルのmax DateFilledカラムを持つレコードのみを取得して、従業員テーブルの対応するレコードと結合するにはどうすればよいですか? ご協力いただければ幸いです。

あなたが ROW_NUMBERを使用することができます
+0

を試みるが、私はそのOracleビューを改訂立ち往生しています古いOracleの右結合構文(WHERE e.EmpId = p.EmpID(+))を使用しているため、そのjoのメソッドで作業するには答えが必要ですiningテーブル。 – user3772397

+0

Oracleの '(+)'構文を外部結合に書き換えることは、これまでに何度も尋ねられてきた全く異なる質問です。このサイトで「oracle outer join」を検索してください –

答えて

1

SELECT e.EmpID, e.Name, p.Position, p.DateFilled 
FROM employee e 
LEFT JOIN (
    SELECT EmpID, Position, DateFilled, 
      ROW_NUMBER() OVER (PARTITION BY EmpID 
          ORDER BY DateFilled DESC) AS rn   
    FROM position 
) p ON e.EmpID = p.EmpID AND p.rn = 1 
+0

これは正しく見えますが、古いOracle右結合構文(e.EmpId = p.EmpID(+))を使用するOracleビューを改訂しています。私はこの概念をその構文の中で機能させるようには思えません。何かご意見は? – user3772397

1

あなたはこのようなMAX() KEEP (DENSE_RANK [FIRST|LAST] ...)を使用してそれを行うことができます。

SELECT e.EmpId, 
     e.Name, 
     p.position, 
     p.datefilled 
FROM employee e 
     INNER JOIN (
     SELECT EmpID, 
       MAX(Position) KEEP (DENSE_RANK LAST ORDER BY DateFilled) AS Position, 
       MAX(DateFilled) AS DateFilled 
     FROM position 
     GROUP BY EmpID 
     ) p 
     ON (e.EmpId = p.EmpID); 
0

はまた、この

select temp.EmpID,(select position from Position where PosID =temp.PosID) position,DateFilled,Name from 
    (select EmpID,max(PosID) PosID,max(DateFilled) DateFilled 
    from position group by EmpID) temp 
    inner join employee emp on emp.EmpID =temp.EmpID 
関連する問題