2016-03-23 22 views
0

Çok basit bir SQL katılma kavramı hakkında yardıma ihtiyacım var.Birleştirilmiş tablodan MAX (tarih) değerini alma

Bir çalışan masam ve bir pozisyon tablom var. Çalışan tablo öylesine gibidir:

EmpID Name 
1  Jane Jones 
2  Bob Smith 
3  Jim Adams 

pozisyon tablosu şu şekildedir:

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 

aşağıdaki çıktıyı almak nasıl: Yani

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 

, başka bir deyişle, nasıl Çalışan tablosundaki karşılık gelen kayıtla birleştirmek için pozisyon tablosundan sadece maksimum DateFilled sütunu ile kayıt almak için katılmalı mıyım? Herhangi bir yardım büyük takdir edilecektir.

+0

deneyin eski Oracle sağ katılma sözdizimini kullanır (WHERE e.EmpId = p.EmpID (+)), bu nedenle jo'nun bu yönteminde çalışmak için cevaba ihtiyacım var ining tabloları. – user3772397

+0

Oracle'ın '(+)' sözdizimini bir dış birleştirmeye yeniden yazmak, daha önce birçok kez sorulmuş tamamen farklı bir sorudur. Sadece "oracle dış birleştirme" için bu siteyi arayın –

cevap

1

Sen ROW_NUMBER kullanabilirsiniz:

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

Bu doğru görünüyor, ancak eski Oracle sağ katılma sözdizimini kullanan bir Oracle görünümünü gözden geçirme takılıyorum (burada e.EmpId = p.EmpID (+)). Bu kavramın söz dizimi içinde çalışmasını sağlayamıyorum. Düşüncesi olan var mı? – user3772397

1

Sen böyle MAX() KEEP (DENSE_RANK [FIRST|LAST] ...) kullanarak yapabilirsiniz:

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

Ben Oracle görünümü revize sıkışmış am, aynı zamanda bu

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 
İlgili konular