2017-02-14 3 views
1

У меня есть одна родительская таблица «Сотрудник», информация сотрудника хранится в трех дочерних таблицах, а в каждой таблице для детей есть одна таблица для детей. Рассмотрим следующие таблицы:Эффективно выбирайте вложенные таблицы зависимостей и несколько столбцов в одной строке, используя объединение в SQL-сервере.

Таблица: Сотрудник (Уровень # 1)

EmpId IsActive 
__________________ 
1  1 
2  1 
3  1 
4  0 
5  0 
6  1 

Таблица: EmployeeEmail (Уровень # 2)

EmpEmailId EmpId EmailId 
______________________________ 
1    1   1 
2    4   3 
3    6   4 

Таблица: EmailAddress (Уровень № 3)

EmailId Email 
____________________________ 
1   [email protected] 
2   [email protected] 
3   [email protected] 
4   [email protected] 

Таблица: Сотрудникфон (уровень № 2)

EmpPhoneId EmpId PhoneId Type 
____________________________________________ 
1    1   1   Mobile 
2    2   2   Mobile 
3    5   4   Fax 
4    1   6   Fax 
5    2   9   Home 

Таблица: PhoneNumber (Уровень № 3)

PhoneId PhoneNumber 
_______________________ 
1   9912345671 
2   9912345672 
3   9912345673 
4   9912345674 
5   9912345675 
6   9912345676 
7   9912345677 
8   9912345678 
9   9912345679 

Теперь мне нужно выбрать Активные сотрудник записей (полную информации), если сотрудник имеет номер телефона, то он должен прийти, в противном случае оно должно быть NULL, мне тоже нужно для электронной почты.

Мой ожидаемый результат:

EmpId  Email    Home  Mobile  Fax 
____________________________________________________________________ 
    1   [email protected]  NULL  9912345671 9912345676 
(...) 

Этот вопрос похож на мой предыдущий вопрос How to effeciently SELECT Nested dependency Tables using JOIN in SQL Server

Пожалуйста, помогите мне, как принести на несколько телефонных номеров в одной строке?

ответ

0

Это простой case стиль pivot, который выглядит, как он будет отвечать вашим потребностям:

select 
     e.EmpId 
    , Email = max(em.Email) 
    , Home = max(case when ep.Type = 'Home' then pn.PhoneNumber else null end) 
    , Mobile = max(case when ep.Type = 'Mobile' then pn.PhoneNumber else null end) 
    , Fax = max(case when ep.Type = 'Fax' then pn.PhoneNumber else null end) 
    from Employee as e 
    left join EmployeeEmail as ee on e.EmpId = ee.EmpId 
    left join EmailAddress as ea on ee.EmailId = ea.EmailId 
    left join EmployeePhone as ep on e.EmpId = ep.EmpId 
    left join PhoneNumber as pn on ep.PhoneId = pn.PhoneId 
    where e.IsActive = 1 
    group by e.EmpId 
Смежные вопросы