sql server

pgx2nnw8  于 2021-07-24  发布在  Java
关注(0)|答案(2)|浏览(285)

我有一张学生信息表和一张家长信息表。我想为每个学生返回一个电子邮件地址,但只有一个。所以我运行这个查询:

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 但我就是想不通。

klh5stk1

klh5stk11#

我想 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 它只返回一封电子邮件,这就是你所要求的。

bvhaajcl

bvhaajcl2#

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

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

这给你每个学生最好的家长电子邮件。

相关问题