senglory » 15 сен 2017, 23:07
Вот такая база. Нужно вернуть запрос , который вернет всех работников старше 50 и участвовавших в разработке более чем 10 проектов. В выводе должны быть колонки
- Имя
- Возраст
- Дата последнего проекта (на основе ProductEmployee.Date)
Я написал так:
Код: Выделить всё
select e0.Name, e0.Age, tt.Name as TheLastProduct
from Employee e0
join (
select e.ID
from Employee e
join ProductEmployee pe on pe.EmployeeID = e.ID
join Product p on p.ID = pe.ProductID
where e.Age > 50
group by e.ID
having COUNT( p.ID) > 10
) e1 on e1.ID = e0.ID
cross apply
(
select top 1 p1.ID, p1.Name from Product p1
join ProductEmployee pe2 on p1.ID = pe2.ProductID
where pe2.EmployeeID = e1.ID order by pe2.Date desc
) tt
Но мне сказали что есть решение лучше. Что-то не пойму как оно выглядит. Подскажите, плиз.
[img]https://discourse-cdn-sjc1.com/business/uploads/sqlteam/optimized/1X/6d08f67cab64e327e42c2e2fa9267a7f05c47dd7_1_690x388.png[/img]
Вот такая база. Нужно вернуть запрос , который вернет всех работников старше 50 и участвовавших в разработке более чем 10 проектов. В выводе должны быть колонки
- Имя
- Возраст
- Дата последнего проекта (на основе ProductEmployee.Date)
Я написал так:
[code]select e0.Name, e0.Age, tt.Name as TheLastProduct
from Employee e0
join (
select e.ID
from Employee e
join ProductEmployee pe on pe.EmployeeID = e.ID
join Product p on p.ID = pe.ProductID
where e.Age > 50
group by e.ID
having COUNT( p.ID) > 10
) e1 on e1.ID = e0.ID
cross apply
(
select top 1 p1.ID, p1.Name from Product p1
join ProductEmployee pe2 on p1.ID = pe2.ProductID
where pe2.EmployeeID = e1.ID order by pe2.Date desc
) tt[/code]
Но мне сказали что есть решение лучше. Что-то не пойму как оно выглядит. Подскажите, плиз.