我有一个包含学生信息[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 BY
和MIN/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
这将为每个学生提供最棒的家长电子邮件。