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
或:
假设您有以下表格:
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
假设您有以下表格:
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