2017-02-10 3 views
0

У меня есть одна родительская таблица «Сотрудник», информация о сотрудниках хранится в 3 детских таблицах, а в каждой таблице для детей есть одна детская таблица. Рассмотрим следующие таблицыКак эффективно Использовать таблицы вложенных зависимостей с использованием JOIN в SQL Server

Таблица: Сотрудник (Уровень # 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] 

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

EmpPhoneId EmpId PhoneId 
______________________________ 
1    1   1 
2    2   2 
3    5   4 

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

PhoneId PhoneNumber 
_______________________ 
1   9912345671 
2   9912345672 
3   9912345673 
4   9912345674 

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

Просьба помочь мне, как присоединиться к этой структуре и эффективно получить записи?

+0

Вам потребуется LEFT OUTER JOIN, а затем вам придется подумать о том, что происходит в случае возможного соединения многих-ко-многим между записями. –

ответ

0

Попробуйте этот запрос, как только это может вам помочь.

select EMP.EmpId, EMP_ADD.Email,PH_NBR.PhoneNumber 
from Employee EMP 
LEFT JOIN EmployeeEmail EMP_EM ON EMP.EMP_ID=EmpId 
LEFT JOIN EmailAddress EMP_ADD ON EMP_ADD.EmailId=EMP_EM.EmpEmailId 
LEFT JOIN EmployeePhone EMP_PH ON EMP_PH.EmpId=EMP.EmpId 
LEFT JOIN PhoneNumber PH_NBR ON PH_NBR.PhoneId=EMP_PH.PhoneId 
WHERE EMP.IsActive=1 

Примечание: Здесь я считать, как 1 Активный и Неактивный, как 0.in случае, если он обратный затем изменить где EMP.IsActive = 0

(ИЛИ) Тест this.here я пытаясь данным телефону и электронной почте отдельно, то соединяя их с emp_id

;with email as 
(
select EMP.EmpId, EMP_ADD.Email 
from Employee EMP 
LEFT JOIN EmployeeEmail EMP_EM ON EMP.EMP_ID=EmpId 
LEFT JOIN EmailAddress EMP_ADD ON EMP_ADD.EmailId=EMP_EM.EmpEmailId 
WHERE EMP.IsActive=1 
) 
,Phone as 
(
select EMP.EmpId,PH_NBR.PhoneNumber 
from Employee EMP 
LEFT JOIN EmployeePhone EMP_PH ON EMP_PH.EmpId=EMP.EmpId 
LEFT JOIN PhoneNumber PH_NBR ON PH_NBR.PhoneId=EMP_PH.PhoneId 
WHERE EMP.IsActive=1 
) 
select * from email e 
left join Phone p on p.EmpId=e.EmpId 
0

Альтернативная форма:

  • только три таблицы, которые вы на самом деле нужно в главном запросе
  • таблицы ответвительные используются склеить их вместе с помощью ON EXISTS(...):

SELECT e.empid, em.email, pn.phonenumber 
FROM employee e 
LEFT JOIN emailaddress em 
     ON EXISTS (-- junctiontable 
     SELECT * FROM employeeemail ee 
     WHERE ee.empid = e.emp_id 
     AND ee.empemailid = em.emailid 
     ) 
LEFT JOIN phonenumber pn 
     ON EXISTS(-- junctiontable 
     SELECT * FROM employeephone ep 
     WHERE ep.empid = e.empid 
     AND ep.phoneid = pn.phoneid 
     ) 
WHERE e.isactive=1 
     ;