如何在左联接上限制每次匹配的结果-SQL Server



我有一个包含学生信息[STU]的表和一个包含家长信息[neneneba PAR]的表。我想为每个学生返回一个电子邮件地址,,但只有一个所以我运行这个查询:

SELECT [STU].[ID], [PAR].[EM]
FROM (SELECT [STU].* FROM DB1.STU) 
STU LEFT JOIN (SELECT [PAR].* FROM DB1.PAR) PAR ON [STU].[ID] = [PAR].[ID]

这给了我下表:

Student ID  ParentEmail
1         jim@email.com
1         sarah@email.com
2         paul@email.com
2         tim@email.com
3         bill@email.com
3         frank@email.com
3         joyce@email.com
4         greg@email.com
5         tony@email.com
5         sam@email.com

每个学生都有多封家长电子邮件,但我只想要一封。换句话说,我希望输出看起来像这样:

Student ID  ParentEmail
1         jim@email.com
2         paul@email.com
3         frank@email.com
4         greg@email.com
5         sam@email.com

我尝试了很多东西。我尝试过使用GROUP BYMIN/MAX,尝试过复杂的CASE语句,尝试过COALESCE语句,但我似乎无法理解。

我认为OUTER APPLY是最简单的方法:

SELECT [STU].[ID], [PAR].[EM]
FROM DB1.STU OUTER APPLY
(SELECT TOP (1) [PAR].*
FROM DB1.PAR
WHERE [STU].[ID] = [PAR].[ID]
) PAR;

通常,子查询中会有一个ORDER BY,让您可以控制您想要的电子邮件——最长、最短、最旧或其他什么。如果没有ORDER BY,它只返回一封电子邮件,这正是您所要求的。

如果您只想要父表中的一列,一个简单的方法是关联子查询:

select 
s.id student_id,
(select max(p.em) from db1.par p where p.id = s.id) parent_email
from db1.stu s

这将为每个学生提供最棒的家长电子邮件。

相关内容

  • 没有找到相关文章

最新更新