2017-03-31 5 views
1

ジャンクションテーブルを含む複数のテーブルからレコードを照会するSQLクエリを作成しようとしています。 Userprofileテーブルは、ロールとチームテーブルとの関係、およびTimeZoneテーブルとの1対1の関係を持っています。ジャンクションテーブルである複数のテーブルを照会する

私はUserProfileテーブルからロール、チーム、タイムゾーンテーブルの関連レコードを取得するクエリを実行しようとしています。私はクエリを書こうとしましたが、それは過度に複雑になっています。誰かが私のクエリを確認し、

の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 
関連する問題