2017-01-23 34 views
0

我有兩個表:Candidate:{IdName}和Candidate_Education:{IdCandidateIdEducationGraduationDate}在右表上加入兩個特殊情況的表格?

我想說明的候選人的名字和他過去的教育,我做了查詢:

SELECT c.Name, ce.Education AS 'Last Education' 
FROM Candidate c 
LEFT JOIN Candidate_Education ce 
    ON c.Id = (SELECT TOP 1 CandidateID FROM Candidate_Education 
       ORDER BY GraduationDate DESC) 

但結果不正確,還有誰賦予的教育考生,他們沒有與Candidate_Education關係

回答

2

更多典型的方法可以做到你想要使用ROW_NUMBER()OUTER APPLY什麼:

SELECT c.Name, ce.Education 
FROM Candidate c OUTER APPLY 
    (SELECT TOP 1 ce.* 
     FROM Candidate_Education ce 
     WHERE ce.CandidateID = c.CandidateID 
     ORDER BY ce.GraduationDate DESC 
    ) ce; 

您的查詢缺少FROM子句中的兩個表之間的連接條件。但是,有一些更適合SQL Server的替代方案。

+0

什麼是'ce。 *'?它只是'*'? –

+0

@MohamedAhmed。 。 。我喜歡在任何地方使用列名。因此'ce。*'。 –

0

其他的解決辦法

with OneCandidate as (
select * from (
       select ce.*, ROW_NUMBER() over(partition by ce.CandidateID order by ce.CandidateID desc) rang 
       from Candidate_Education ce 
       ) tmp 
where tmp.rang=1 
) 
SELECT c.Name, ce.Education 
FROM Candidate c left outer OneCandidate ce on ce.CandidateID = c.CandidateID 
0
WITH maxGraduationCTE AS 
(SELECT Id, MAX(GraduationDate) AS 'Last Education' FROM Candidate_Education 
GROUP BY Id), 

lastEducationCTE AS 
(SELECT [Last Education], ce.Id, ce.CandidateId, ce.Education FROM maxGraduationCTE 
INNER JOIN Candidate_Education ce ON maxGraduationCTE.Id = ce.Id); 

SELECT c.Name, 
CASE WHEN [Last Education] IS NULL THEN 'No Education' 
    ELSE CAST([Last Education] As Varchar) 
END As [Last Education] 
FROM Candidate c 
LEFT JOIN lastEducationCTE ce 
ON c.Id = ce.CandidateId 

您可以使用兩個CTE表情和左與CASE語句加入到處理空值。我使用了一個案例,因爲我不確定GraduationDate的數據類型...可能必須將其轉換,因爲如果它是日期,則不能混合使用varchar和日期數據類型