2013-05-17 5 views
5

मेरे पास दो टेबल Person और Salary हैं।बाएं बाहरी जॉइन (तालिका से चुनें * यह संभव है?

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 

मुझे क्या करना है, यह परिणामों में अधिक मौजूदा वेतन की जानकारी प्रदर्शित करना चाहिए कि अगर कोई व्यक्ति तो एक वेतन रिकॉर्ड है कोशिश कर रहा हूँ क्या, यदि कोई वेतन रिकॉर्ड नहीं है तो उसे वेतन की जानकारी को शून्य के रूप में प्रदर्शित करना चाहिए, जो ...

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

मैं जानता हूँ कि यह कुछ इस तरह है, लेकिन मैं सिर्फ ज्ञान को प्राप्त नहीं कर सकता है की कमी के साथ हो गया है ..

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

आप लगभग वहां हैं - अब जब आपने अपनी जॉइन सेट की है, तो जो भी गुम है, वह है ... ...) पीएलर्सआईडी = एसएल। पीटरसन आईडी पर एसएल ** ** उन दो सेटों को जोड़ने के लिए स्थिति में शामिल हों ** एक साथ डेटा –

उत्तर

4

मैं उस व्यक्ति और तिथि के अनुसार वेतन रैंकिंग एक CTE और ROW_NUMBER() समारोह के साथ द्वारा शुरू होगा। यह व्यक्ति द्वारा सबसे हालिया वेतन को पहली स्थिति में अवरोही क्रम में रखेगा, जिसे हम बाद में फ़िल्टर कर सकते हैं (जहां रैंक = 1)। उसके बाद, यह aliased CTE के लिए एक सरल LEFT JOINPerson से हो जाता है:

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 

वैकल्पिक रूप से, आप CTE की सामग्री को लेने के लिए और यह क्वेरी आप शुरू कर दिया है (यानी LEFT JOIN (<CTE query>)) के कोष्ठक के बीच में ले जाने के कर सकते हैं। बस = 1 बाधा जोड़ने के लिए याद रखें।

संबंधित मुद्दे