2017-03-31 36 views
1

我想写一个SQL查询,查询涉及联结表的多个表中的记录。 Userprofile表与角色和团队表以及与TimeZone表的一对一关系具有关系。查询多个表两个正在联结表

我想实现一个查询,将从UserProfile表中提取记录以及来自角色,团队和时区表的相关记录。我试图写一个查询,它变得过于复杂。可能有人验证我的查询,告诉我做

正道表如下所示

用户配置表

[EmployeeID] 
    [Forename] 
    [Surname] 
    [PreferredName] 
    [DefaultLanguageCode] 
    [DefaultCountryCode] 
    [TimeZoneID] 
    [Domain] 
    [NetworkID] 

队表

[TeamID] 
    [CountryCode] 
    [TeamName] 
    [TeamDescription] 

UserTeamLinkTable

[UserProfileTeamLinkID] 
    [TeamID] 
    [UserProfileID] 
    [isDefault] 
    [isActive] 

表的UserRole

[RoleID] 
    [RoleDescription] 
    [isActive] 

UserRoleLink表

[UserProfileRoleLinkID] 
    [RoleID] 
    [UserProfileID] 
    [isActive] 

时区表

[TimeZoneID] 
    [TimeZoneCode] 
    [TimeZone] 
    [TimeZoneName] 

查询

select 

    userprofile.[UserProfileID] 
    ,userprofile.[EmployeeID] 
    ,userprofile.[Forename] 
    ,userprofile.[Surname] 
    ,userprofile.[PreferredName] 
    ,userprofile.[DefaultCountryCode] 
    ,userprofile.[DefaultLanguageCode] 
    ,userprofile.[TimeZoneID] 
    ,userprofile.TeamID 
    ,userprofile.TeamName 
    ,userprofile.[Domain] 
    ,userprofile.[NetworkID] 
    ,userprofile.[EmailAddress] 
    ,userprofile.[CreatedDate] 
    ,userprofile.[CreatedBy] 
    ,userprofile.[ModifiedDate] 
    ,userprofile.[ModifiedBy] 

from TimeZone tz inner join 
(
select 
    up.[UserProfileID] 
    ,up.[EmployeeID] 
    ,up.[Forename] 
    ,up.[Surname] 
    ,up.[PreferredName] 
    ,up.[DefaultCountryCode] 
    ,up.[DefaultLanguageCode] 
    ,up.[TimeZoneID] 
    ,te.TeamID 
    ,te.TeamName 
    ,up.[Domain] 
    ,up.[NetworkID] 
    ,up.[EmailAddress] 
    ,up.[CreatedDate] 
    ,up.[CreatedBy] 
    ,up.[ModifiedDate] 
    ,up.[ModifiedBy] 


from [dbo].[UserProfileTeamLink] upt 
inner join UserProfile up on up.UserProfileID = upt.UserProfileID 
inner join Team te on te.TeamID = upt.TeamID) userprofile on tz.TimeZoneID = userprofile.TimeZoneID 

回答

0

这是很难不知道什么数据看起来还是什么期望的输出样子说。如果由于这些多对多关系而期望每个用户有多行,则可以在不使用子查询的情况下加入所有表。

select 
    up.[UserProfileID] 
    ,up.[EmployeeID] 
    ,up.[Forename] 
    ,up.[Surname] 
    ,up.[PreferredName] 
    ,up.[DefaultCountryCode] 
    ,up.[DefaultLanguageCode] 
    ,up.[TimeZoneID] 
    ,tz.TimeZone 
    ,te.TeamID 
    ,te.TeamName 
    ,up.[Domain] 
    ,up.[NetworkID] 
    ,up.[EmailAddress] 
    ,up.[CreatedDate] 
    ,up.[CreatedBy] 
    ,up.[ModifiedDate] 
    ,up.[ModifiedBy] 
    ,ur.RoleDescription 
from UserProfile up 
    inner join TimeZone tz 
    on tz.TimeZoneID = up.TimeZoneID 
    inner join UserProfileTeamLink upt 
    on upt.UserProfileID = upt.UserProfileID 
    --and upt.isDefault = 1 /* default team only? */ 
    --and upt.isActive = 1 /* active team only? */ 
    inner join Team te 
    on te.TeamID = upt.TeamID 
    inner join UserProfileRoleLink upr /* left join if users might not have a role*/ 
    on up.UserProfileID = upr.UserProfileId 
    --and upr.isActive = 1 /* active role only? */ 
    inner join UserRole ur /* left join if users might not have a role*/ 
    on upr.RoleId = ur.RoleId