SQL Join, чтобы получить значение принадлежат с самой последней датой - PullRequest
0 голосов
/ 21 ноября 2011

у меня есть стол

работник

emp_id, ~10 other fields
a1
b1

emp_type

emp_id, effective_date, employee_type
a1            2/1/2011        RS
a1            9/3/2011        TU
b1            3/2/2011        RS

Я делаю что-то вроде этого:

select emp_id, ~10 other fields, employee_type
from employee e
inner join emp_type et
   on et.emp_id = e.emp_id
      and effective_date = (select max(effective_date) 
                            from emp_type et2 
                            where et2.emp_id = et.emp_id)

Это самый эффективный способ сделать это? Он не работает слишком медленно, но это очень распространенный запрос в отчетах, и я хочу использовать наиболее эффективный метод. Тип emp_type имеет не более 4-5 записей на сотрудника, но обычно только одну. Есть около 20 000 сотрудников. Я видел решение для перекрестного применения, но обнаружил, что оно медленнее.

Ответы [ 3 ]

2 голосов
/ 21 ноября 2011

Я предлагаю создать представление, содержащее только самый новый тип сотрудника:

CREATE VIEW active_emp_type
AS
Select a.emp_id, a.effective_date, a.employee_type
from emp_type a
where a.effective_date = (select max(effective_date) from emp_type 
                          where emp_id = a.emp_id)

(или другой метод получения таких же результирующих данных представления)

Тогда использовать его в другом месте (многочисленные отчеты и т. Д.) Проще:

select e.emp_id, ~10 other fields, t.employee_type
from employee e
join active_emp_type t on e.emp_id = t.emp_id
1 голос
/ 21 ноября 2011

Я думаю, что JOIN для подзапроса будет более эффективным - весь набор результатов рассчитывается один раз, а не один раз для строки:

select emp_id, ~10 other fields, employee_type
from employee e
inner join emp_type et
   on et.emp_id = e.emp_id
Inner join (SELECT emp_id, MAX(effective_date) effective_date
            FROM Emp_type et2
            GROUP BY Emp_id) SubQ
ON SubQ.emp_id = et.emp_id
AND SubQ.effective_date = et.effective_date
1 голос
/ 21 ноября 2011

Я думаю это самый эффективный способ.

пожалуйста, не забудьте поместить индексы в поля соединения и в поле даты и времени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...