Я не знаю вашу схему так же хорошо, как вы, но предположил бы, что вам нужно коррелировать ваши группировки по DepartmentID
, а не DepartmentPhoneID
.
select x.*
from DepartmentPhone x
where
x.DepartmentID = 2
and x.PhoneID = (select max(y.PhoneID)
from departmentphone y
join Phone on y.PhoneID = Phone.PhoneID and Phone.PhoneType = 4
where x.DepartmentID = y.DepartmentID);
Вот пара альтернативных запросов, которые должны получить тот же результат без использования коррелированного подзапроса. Первый использует производную таблицу:
select *
from DepartmentPhone x
join (select d.DepartmentID, max(d.PhoneID) as maxPhoneID
from DpartmentPhone d join Phone p using (PhoneID)
where p.PhoneType = 4
group by d.DepartmentID) y
using (DepartmentID);
Второй вариант вообще не использует подзапрос, а само-соединение:
select d1.*
from DepartmentPhone d1
join Phone p1 on d1.PhoneID = p1.PhoneID and p1.PhoneType = 4
left outer join (DepartmentPhone d2 join Phone p2
on d2.PhoneID = p2.PhoneID and p2.PhoneType = 4)
on d1.DepartmentID = d2.DepartmentID and d1.PhoneID < d2.PhoneID
where d2.DepartmentID is NULL;