如何 select 连接中的第一行 returns 主键上的多行

How to select first row from a join that returns multiple rows on the primary key

我要加入两个 table。他们共享一把钥匙。 employee table 每个主键有一个名字,但 email table 每个 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, min(em.email) as email
from employee ep
left join email em on em.employeeid = ep.id
group by ep.id, ep.personname

假设您有以下表格:

  1. 员工(身份证、姓名)
  2. 邮箱(身份证、员工编号*、邮箱)

您可以做的是使用 ROW_NUMBER 按 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