【问题标题】:How to select first row from a join that returns multiple rows on the primary key如何从返回主键多行的连接中选择第一行
【发布时间】:2021-04-02 06:37:33
【问题描述】:

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

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

编辑:我看到的第一封电子邮件将是连接中显示的第一封电子邮件行,因为 SQL 通过查询工作。我不关心出现哪个电子邮件。只有不超过一封电子邮件出现。我希望这能让它更清楚。

我当前的查询:

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

【问题讨论】:

    标签: sql sql-server greatest-n-per-group sql-server-2019 lateral-join


    【解决方案1】:

    假设您有以下表格:

    1. 员工(Id、PersonName)
    2. 电子邮件(Id、EmployeeId*、电子邮件)

    你可以做的是使用ROW_NUMBER EmployeeId 分区和Email 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
    

    【讨论】:

      【解决方案2】:

      一种方法使用子查询:

      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
      

      【讨论】:

        猜你喜欢
        • 2016-05-20
        • 2012-03-22
        • 1970-01-01
        • 2020-11-09
        • 1970-01-01
        • 2011-08-27
        • 1970-01-01
        • 2015-01-16
        • 2011-12-26
        相关资源
        最近更新 更多