如何 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
假设您有以下表格:
- 员工(身份证、姓名)
- 邮箱(身份证、员工编号*、邮箱)
您可以做的是使用 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
我要加入两个 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
假设您有以下表格:
- 员工(身份证、姓名)
- 邮箱(身份证、员工编号*、邮箱)
您可以做的是使用 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