Sql 如何从主键上返回多行的联接中选择第一行

Sql 如何从主键上返回多行的联接中选择第一行,sql,sql-server,greatest-n-per-group,sql-server-2019,lateral-join,Sql,Sql Server,Greatest N Per Group,Sql Server 2019,Lateral Join,我有两张桌子要加入。他们共用一把钥匙。employee表中每个主键有一个名称,但是email表中每个employeeId有多个电子邮件 我只想为每位员工显示第一封电子邮件。目前,我得到了每个员工多行,因为他们有多封电子邮件。我正在运行SQL Server 2019 编辑:我看到的第一封电子邮件,它将是SQL在查询中运行时在联接中显示的第一个电子邮件行。我不管哪封邮件出现。只是显示的邮件不超过一封。我希望这能让事情更清楚 我当前的查询: Select Employee.PersonName, Em

我有两张桌子要加入。他们共用一把钥匙。
employee
表中每个主键有一个名称,但是
email
表中每个
employeeId
有多个电子邮件

我只想为每位员工显示第一封电子邮件。目前,我得到了每个员工多行,因为他们有多封电子邮件。我正在运行SQL Server 2019

编辑:我看到的第一封电子邮件,它将是SQL在查询中运行时在联接中显示的第一个电子邮件行。我不管哪封邮件出现。只是显示的邮件不超过一封。我希望这能让事情更清楚

我当前的查询:

Select Employee.PersonName, Email.Email
From Employee
left join on Employee.ID = Email.employeeId;

一种方法使用子查询:

select ep.personname, em.*
from employee ep
cross apply (
    select top (1) em.email 
    from email em   
    where em.employeeid = ep.id 
    order by em.email
) em
如果您只需要电子邮件而不需要其他内容,聚合也可以:

select ep.personname, 
    (select min(em.email) from email em where em.employeeid = ep.id) as email
from employee ep
或:


一种方法使用子查询:

select ep.personname, em.*
from employee ep
cross apply (
    select top (1) em.email 
    from email em   
    where em.employeeid = ep.id 
    order by em.email
) em
如果您只需要电子邮件而不需要其他内容,聚合也可以:

select ep.personname, 
    (select min(em.email) from email em where em.employeeid = ep.id) as email
from employee ep
或:


假设您有以下表格:

  • 员工(Id、人名)
  • 电子邮件(Id,员工Id*,电子邮件)
  • 您可以按EmployeeId进行分区,并对电子邮件Id进行排序:

       SELECT Employee.PersonName, Email.Email
         FROM Employee
    LEFT JOIN (SELECT EmployeeId, Email, ROW_NUMBER(PARTITION BY EmployeeId ORDER BY Id FROM Email) RN) Email
              ON (Employee.Id = Email.EmployeeId)
        WHERE Email.RN = 1
    

    假设您有以下表格:

  • 员工(Id、人名)
  • 电子邮件(Id,员工Id*,电子邮件)
  • 您可以按EmployeeId进行分区,并对电子邮件Id进行排序:

       SELECT Employee.PersonName, Email.Email
         FROM Employee
    LEFT JOIN (SELECT EmployeeId, Email, ROW_NUMBER(PARTITION BY EmployeeId ORDER BY Id FROM Email) RN) Email
              ON (Employee.Id = Email.EmployeeId)
        WHERE Email.RN = 1