0

这是我的表:

[Member]: 
{ [Id], [UserId], [UserName], [Email], [Status_Id], [MemberType_Id] }

[CustomerProfile] :
{ [Id], [Member_Id], [FirstName], [LastName], [SSN], [Gender], [PostalCode],[City_Id], [Address]}


[DealerProfile]:
{ [Id], [Member_Id], [FirstName], [LastName], [SSN], [Gender], [StoreName], [PostalCode], [City_Id], [Address] }


[ManagerProfile]
{ [Id], [Member_Id], [FirstName], [LastName], [SSN], [Gender] }

[City]:
{ [Id], [Title], [Province_Id] }

所以我需要创建我所有成员和相关列的完整视图。

我必须提到 [Member].[Id] 只是在 3 个配置文件表之一中。这意味着一个会员可以拥有一种类型的客户、经销商或经理

首先,我将从以下选择查询开始:

 SELECT     
[ME].[Id] AS [MemberId],
[ME].[UserId],
[ME].[UserName],
[ME].[Status_Id],
[ST].[Title] AS [Status],
[ME].[MemberType_Id],
[MT].[Title] AS [MemberType],

CASE
    WHEN [MT].[Title]='Customer' THEN [CUP].[FirstName]
    WHEN [MT].[Title]='Dealer' THEN [DEP].[FirstName]
    WHEN [MT].[Title]='Manager' THEN [MAP].[FirstName]
    ELSE 'Unknown' END AS [FirstName],
CASE
    WHEN [MT].[Title]='Customer' THEN [CUP].[LastName]
    WHEN [MT].[Title]='Dealer' THEN [DEP].[LastName]
    WHEN [MT].[Title]='Manager' THEN [MAP].[LastName]
    ELSE 'Unknown' END AS [LastName]

FROM [Members].[Member] AS [ME]
INNER JOIN [Members].[MemberType] AS [MT] ON [ME].[MemberType_Id] = [MT].[Id]
INNER JOIN [Members].[Status] AS [ST] ON [ME].[Status_Id]=[ST].[Id]
INNER JOIN [Members].[ManagerProfile] AS [MAP] ON [ME].[Id]= [MAP].[Member_Id]
INNER JOIN [Members].[CustomerProfile] AS [CUP] ON [ME].[Id]=[CUP].[Member_Id]
INNER JOIN [Members].[DealerProfile] AS [DEP] ON [ME].[Id]=[DEP].[Member_Id];

但正如我之前所说,[Member].[ID] 只是在 3 个配置文件表之一中,所以上面的查询返回 null,我认为这样使用Union All

(SELECT   
[ME].[Id] AS [MemberId],
[ME].[UserId],
[ME].[UserName],
[ME].[Status_Id],
[ST].[Title] AS [Status],
[ME].[MemberType_Id],
[MT].[Title] AS [MemberType],
[PR].[FirstName] AS [FirstName],
[PR].[LastName] AS [LastName]

FROM [Members].[Member] AS [ME]
INNER JOIN [Members].[MemberType] AS [MT] ON [ME].[MemberType_Id] = [MT].[Id]
INNER JOIN [Members].[Status] AS [ST] ON [ME].[Status_Id]=[ST].[Id]
INNER JOIN [Members].[CustomerProfile] AS [PR] ON [ME].[Id]=[PR].[Member_Id])
UNION ALL
(SELECT   
[ME].[Id] AS [MemberId],
[ME].[UserId],
[ME].[UserName],
[ME].[Status_Id],
[ST].[Title] AS [Status],
[ME].[MemberType_Id],
[MT].[Title] AS [MemberType],
[PR].[FirstName] AS [FirstName],
[PR].[LastName] AS [LastName]

FROM [Members].[Member] AS [ME]
INNER JOIN [Members].[MemberType] AS [MT] ON [ME].[MemberType_Id] = [MT].[Id]
INNER JOIN [Members].[Status] AS [ST] ON [ME].[Status_Id]=[ST].[Id]
INNER JOIN [Members].[DealerProfile] AS [PR] ON [ME].[Id]=[PR].[Member_Id])
UNION ALL
(SELECT   
[ME].[Id] AS [MemberId],
[ME].[UserId],
[ME].[UserName],
[ME].[Status_Id],
[ST].[Title] AS [Status],
[ME].[MemberType_Id],
[MT].[Title] AS [MemberType],
[PR].[FirstName] AS [FirstName],
[PR].[LastName] AS [LastName]

FROM [Members].[Member] AS [ME]
INNER JOIN [Members].[MemberType] AS [MT] ON [ME].[MemberType_Id] = [MT].[Id]
INNER JOIN [Members].[Status] AS [ST] ON [ME].[Status_Id]=[ST].[Id]
INNER JOIN [Members].[ManagerProfile] AS [PR] ON [ME].[Id]=[PR].[Member_Id])

那么您认为,这是创建像我的视图这样的视图的好方法吗?有没有更好的方法来创建性能更好的视图而不是使用Union All?您对最短路径和最佳性能有何建议?

4

2 回答 2

1

UNION ALL 通常会产生相当差的性能。

另一种方法是使用 LEFT OUTER JOIN 的内部查询和使用 CASE 语句选择相关字段的外部查询。我怀疑这将为您带来更好的性能。

为简单起见,让我们仅使用您的客户资料和经销商资料表。当您将其扩展到连接中的其他表时,同样的概念将适用。另一种方法,使用左外连接,看起来像这样:

create view MembersView as
select Id, 
case
    when not FirstName_cp is null then FirstName_cp
    when not FirstName_dp is null then First_name_dp
    else null
end as FirstName,
case
    when not LastName_cp is null then LastName_cp
    when not LastName_dp is null then Last_name_dp
    else null
end as LastName
from 
(

    select m.[Id] as Member_Id, cp.[FirstName] as FirstName_cp, 
           cp.[LastName] as LastName_cp, 
           dp.[FirstName] as FirstName_dp, 
           dp.[LastName] as LastName_dp
    from [Member] m
    left outer join [CustomerProfile] cp on
        m.Id = cp.Member_Id
    left outer join DealProfile dp on
        m.Id = dp.Member_Id
) as TBL
于 2012-04-12T12:30:21.473 回答
0

LEFT JOINCOALESCE

SELECT     
[ME].[Id] AS [MemberId],
[ME].[UserId],
[ME].[UserName],
[ME].[Status_Id],
[ST].[Title] AS [Status],
[ME].[MemberType_Id],
[MT].[Title] AS [MemberType],
[FirstName]=COALESCE([CUP].[FirstName],[DEP].[FirstName],[MAP].[FirstName],'Unknown'),
[LastName]=COALESCE([CUP].[LastName],[DEP].[LastName],[MAP].[LastName],'Unknown')
FROM [Members].[Member] AS [ME]
INNER JOIN [Members].[MemberType] AS [MT] ON [ME].[MemberType_Id] = [MT].[Id]
INNER JOIN [Members].[Status] AS [ST] ON [ME].[Status_Id]=[ST].[Id]
LEFT JOIN [Members].[ManagerProfile] AS [MAP] ON [ME].[Id]= [MAP].[Member_Id]
LEFT JOIN [Members].[CustomerProfile] AS [CUP] ON [ME].[Id]=[CUP].[Member_Id]
LEFT JOIN [Members].[DealerProfile] AS [DEP] ON [ME].[Id]=[DEP].[Member_Id];
于 2012-04-12T12:12:41.560 回答