2017-03-31 45 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