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