SELECT SD.EmpId, SD.RemainingAdvance
FROM
SalaryDetails SD INNER JOIN
(SELECT SD2.EmpID, MAX(SD2.CreatedDate) AS MAXDate
FROM SalaryDetails SD2 GROUP BY SD2.EmpID) AS SD2
ON SD.EmpID = SD2.EmpID
INNER JOIN Employee E
ON SD.EmpID = E.EmpID
WHERE E.Desig_Id = '27' AND SD.CreatedDate = SD2.MaxDate
Примечание. Запрос пишется без его проверки.
Я полагаю, это то, что вы ищете.
Этот вариант также работает (по крайней мере, в одной СУБД, а именно в IBM Informix Dynamic Server 11.50):
SELECT SD.EmpId, SD.RemainingAdvance
FROM SalaryDetails SD
INNER JOIN
(SELECT SD2.EmpID, MAX(SD2.CreatedDate) AS MAXDate
FROM SalaryDetails SD2 GROUP BY SD2.EmpID) AS SD2
ON SD.EmpID = SD2.EmpID AND SD.CreatedDate = SD2.MaxDate
INNER JOIN Employee E
ON SD.EmpID = E.EmpID
WHERE E.Desig_Id = '27'
Составное объединение в первом предложении ON может повысить производительность запроса, но вполне возможно, что оптимизатор в любом случае поднимет условие 'AND SD.CreatedDate = SD2.MaxDate', то есть вы не заметите никаких разница, даже если вы изучили два плана запроса. Я не совсем уверен, как лучше сделать отступ для табличных выражений после основного предложения FROM.
Под редакцией Джонатана Леффлера - по просьбе Шахкальпеша.