2013-05-17 10 views
5

Ich habe zwei Tabellen Person und Salary.LEFT OUTER JOIN (AUSWAHL * AUS TABELLE) ist das möglich?

Person:

PersonId | Name | Surname 
-------------------------------- 
     1  John   Deer 
     2  Mark   Bear 

Salary:

SId | PersonId | Date      | Salary 
---------------------------------------------------- 
1   2 2013-01-01 00:00:00.000  100 
2   2 2012-01-01 00:00:00.000  90 
3   2 2011-01-01 00:00:00.000  80 

Was ich zu tun versuche, ist, wenn eine Person eine Gehaltssatz hat, dann sollte es die aktuellen Gehaltsinformationen in den Ergebnissen angezeigt werden, Wenn kein Lohndatensatz vorhanden ist, sollte die Gehaltsinformation als Null angezeigt werden. Dies ist wie folgt:

Result 
------------------------------------------------------------------------ 
PersonId | Name | Surname | Date      | Salary 
     1  John  Deer  NULL       NULL 
     2  Mark  Bear  2013-01-01 00:00:00.000   100 

Ich weiß es, so etwas sein, hat aber mit einem Mangel an Wissen kann ich einfach nicht erreichen ..

SELECT 
    P.PersonId, P.Name, P.Surname, SL.Date, SL.Salary 
FROM 
    PERSON P 
LEFT OUTER JOIN 
    (SELECT TOP 1 S.PersonId, S.Date, S.Salary 
    FROM Salary 
    WHERE S.PersonId = P.PersonId ORDER BY Date DESC) SL 
+5

Sie sind fast da - jetzt, dass Sie Ihre JOIN eingerichtet haben, ist alles, was fehlt ein "...) SL ON P.PersonId = SL.PersonId" ** Join Bedingung **, um diese beiden Sätze zu verknüpfen Daten zusammen –

Antwort

4

ich durch die Reihung der Gehälter von Person und Datum mit einem CTE und die ROW_NUMBER() Funktion beginnen würde. Dies wird das letzte Gehalt nach Person in absteigender Reihenfolge auf die erste Position setzen, die wir später filtern können (wobei Rang = 1). Danach wird es ein einfaches LEFT JOIN von Person zum aliased CTE:

WITH RankedSalaries AS 
(
    SELECT 
     PersonId 
     ,Date 
     ,Salary 
     ,ROW_NUMBER() OVER (PARTITION BY PersonId ORDER BY Date DESC) AS RowNum 
    FROM 
     Salary 
) 
SELECT 
    p.PersonId 
    ,p.Name 
    ,p.Surname 
    ,s.Date 
    ,s.Salary 
FROM 
    Person p 
LEFT JOIN 
    RankedSalaries s 
    ON 
    p.PersonId = s.PersonId 
WHERE 
    s.RowNum = 1 

Alternativ können Sie den Inhalt des CTE nehmen und es in zwischen den Klammern der Abfrage, die Sie (das heißt LEFT JOIN (<CTE query>)) gestartet bewegen. Denken Sie daran, die Einschränkung = 1 hinzuzufügen.

Verwandte Themen