Используйте union all
и агрегацию:
select Employee, Function, count(distinct dept)
from ((select Employee, Function, Start_dept as dept
from e
) union all
(select Employee, Function, End_dept
from e
)
) e
group by Employee, Function;
Если вы хотите повысить производительность, я бы предложил начать с двух индексов (Employee, Function, Start_Dept)
и (Employee, Function, End_Dept)
.Затем:
select Employee, Function, count(distinct dept)
from ((select distinct Employee, Function, Start_dept as dept
from e
) union all
(select distinct Employee, Function, End_dept
from e
)
) e
group by Employee, Function;
Подзапросы должны сканировать индекс, а не общую таблицу.Вам все равно нужно будет сделать финал GROUP BY
.Я предполагаю, что COUNT(DISTINCT)
- лучший подход, чем UNION
в подзапросе, но вы можете проверить это.