Sql server 使用SQL server中的联接高效地选择嵌套的依赖关系表和单行中的多列

Sql server 使用SQL server中的联接高效地选择嵌套的依赖关系表和单行中的多列,sql-server,left-join,outer-join,Sql Server,Left Join,Outer Join,我有一个父表“Employee”,员工信息存储在三个子表中,每个子表有一个子表。考虑下面的表格: 表:员工(1级) 表:员工电子邮件(二级) 表:电子邮件地址(第3级) 表:员工电话(2级) 表:电话号码(第3级) 现在我需要选择活动员工记录(完整信息),如果该员工有电话号码,则该号码应为空,否则该号码应为空,我也需要相同的电子邮件号码 我的预期产出: EmpId Email Home Mobile Fax ___________

我有一个父表“Employee”,员工信息存储在三个子表中,每个子表有一个子表。考虑下面的表格:

表:员工(1级)

表:员工电子邮件(二级)

表:电子邮件地址(第3级)

表:员工电话(2级)

表:电话号码(第3级)

现在我需要选择活动员工记录(完整信息),如果该员工有电话号码,则该号码应为空,否则该号码应为空,我也需要相同的电子邮件号码

我的预期产出:

EmpId        Email             Home        Mobile        Fax
____________________________________________________________________
  1          one@gmail.com     NULL        9912345671    9912345676
(...)
这个问题与我先前的问题相似


请帮助我如何在一行中提取多个电话号码

这是一个简单的
案例
样式
透视
,看起来它适合您的需要:

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

这是一个简单的
案例
样式
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
EmpPhoneId    EmpId    PhoneId    Type
____________________________________________
1             1         1         Mobile
2             2         2         Mobile
3             5         4         Fax
4             1         6         Fax
5             2         9         Home
PhoneId    PhoneNumber
_______________________
1          9912345671
2          9912345672
3          9912345673
4          9912345674
5          9912345675
6          9912345676
7          9912345677
8          9912345678
9          9912345679
EmpId        Email             Home        Mobile        Fax
____________________________________________________________________
  1          one@gmail.com     NULL        9912345671    9912345676
(...)
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