2016-03-23 11 views
0

Ich brauche Hilfe zu einem sehr einfachen SQL-Join-Konzept, das ich scheinbar nicht richtig verstehe.Abrufen des MAX (Datum) -Werts aus der Joined-Tabelle

Ich habe eine Angestelltentabelle und eine Positionstabelle. Die Mitarbeitertabelle ist wie folgt:

EmpID Name 
1  Jane Jones 
2  Bob Smith 
3  Jim Adams 

Die Positionstabelle ist wie folgt:

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 

Wie kann ich die folgende Ausgabe:

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 

Also, mit anderen Worten, wie schließe ich mich an, um nur den Datensatz mit der Spalte Max DateFilled aus der Positionstabelle mit dem entsprechenden Datensatz in der Tabelle employee zu verknüpfen? Jede Hilfe würde sehr geschätzt werden.

+0

Auch ich stecke die Überarbeitung eines Oracle Ansicht, dass verwendet die alte Oracle-Joinsyntax (WHERE e.EmpId = p.EmpID (+)), daher muss die Antwort in dieser Joomethode funktionieren Ining-Tabellen. – user3772397

+0

Das Umschreiben von Oracles "(+)" -Syntax in einen äußeren Join ist eine ganz andere Frage, die schon oft gestellt wurde. Suchen Sie einfach auf dieser Seite nach "Orakel Outer Join" –

Antwort

1

können Sie ROW_NUMBER verwenden:

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

Das sieht richtig aus, aber ich bin dabei, eine Oracle-Ansicht zu revidieren, die die alte Oracle-Recht-Join-Syntax verwendet (wobei e.EmpId = p.EmpID (+)). Ich kann nicht scheinen, dass dieses Konzept innerhalb dieser Syntax funktioniert. Irgendwelche Gedanken? – user3772397

1

Sie können es MAX() KEEP (DENSE_RANK [FIRST|LAST] ...) tun, wie folgt mit:

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

versuchen, diese

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