我目前根据以下查询生成了四列:
SELECT DISTINCT Client, Name, Email
FROM Login_Requests AS extR
INNER JOIN Login_Clients AS extC
ON lower(extC.Name) = lower(extR.Client)
INNER JOIN Login_EmailDomains AS extED
ON extED.ClientID = extC.ClientID
INNER JOIN Login_Admins AS extU
ON extU.GroupID = extED.GroupID
WHERE extR.ReqStatusID = 2 AND extU.GroupID = 2;
结果如下:
Client Name Email
------- ----- ------
Google Jon Snow snowj@google.com
Google Ned Stark starkn@google.com
Apple Bat Man manb@apple.com
Apple Cat Woman womanc@apple.com
Microsoft Bill Gates gatesb@microsoft.com
但是,我想从Login_Admins
表中获取管理员,并将其作为最后一列添加到结果查询中,如下所示:
Client Name Email Admin
------- ----- ------ ------
Google Jon Snow snowj@google.com adminthefirst@shujin.com
Google Ned Stark starkn@google.com adminthefirst@shujin.com
Apple Bat Man manb@apple.com adminthesecond@shujin.com
Apple Cat Woman womanc@apple.com adminthesecond@shujin.com
Microsoft Bill Gates gatesb@microsoft.com adminthethird@shujin.com, adminthefourth@shujin.com
像这样。基本上,可以将一个或甚至两个管理员分配给一个客户端。我目前在编写逻辑时难以在结果集的末尾附加该admin列。我最初尝试的可能是创建一个像这样的子查询:
SELECT COALESCE((SELECT Login_Admins.Email
FROM Login_Admins
WHERE UserTypeID = 2 AND extED.GroupID = 2), ',', '')
只是在SELECT语句的末尾添加它,但最终没有对我有利。 我正在做什么甚至是可能的,因为我对如何做到这一点感到茫然。
答案 0 :(得分:1)
使用CASE
表达式以及SELECT
列表中的其他列,如
SELECT DISTINCT Client, Name, Email,
case when Login_Admins.UserTypeID = 2 AND extED.GroupID = 2
then Login_Admins.Email else null end as Admin_Email
答案 1 :(得分:1)
如前所述,您需要使用FOR XML在一行中获取所有内容。如果没有任何内容,AdminEmails将返回NULL,即使有一个CROSS APPLY,所以如果不可能,你可能需要处理它:
SELECT Client, Name, Email, adm.Admin
FROM Login_Requests AS extR
INNER JOIN Login_Clients AS extC
ON lower(extC.Name) = lower(extR.Client)
INNER JOIN Login_EmailDomains AS extED
ON extED.ClientID = extC.ClientID
CROSS APPLY
(
SELECT STUFF((SELECT CONCAT(', ', extU.Email)
FROM Login_Admins AS extU
WHERE extU.GroupID = extED.GroupID
FOR XML PATH('')), 1, 2, '') AS Admin
) AS adm