sql - DB2 返回第一个匹配项

标签 sql ibm-midrange db2-400

在 V6R1 的 DB2 for i(又名 DB2/400)中,我想编写一个 SQL SELECT 语句,它从标题记录中返回一些列,而一些列仅从一个匹配的详细记录中返回。它可以是任何匹配记录,但我只想要其中一个的信息。我可以使用下面的查询来完成此操作,但我认为必须有比使用 WITH 子句更简单的方法。我会在需要时使用它,但我一直在想,“一定有更简单的方法”。本质上,我只是从 Person 表返回 firstName 和 lastName ...加上 PersonEmail 表中匹配的电子邮件地址之一。

谢谢!

    with theMinimumOnes as (
    select personId,
           min(emailType) as emailType  
      from PersonEmail
     group by personId
    )
    select p.personId,
           p.firstName,
           p.lastName,
           pe.emailAddress
      from Person p
      left outer join theMinimumOnes tmo
        on tmo.personId = p.personId
      left outer join PersonEmail pe
        on pe.personId = tmo.personId
       and pe.emailType  = tmo.emailType

    PERSONID   FIRSTNAME                       LASTNAME                        EMAILADDRESS
           1   Bill                            Ward                            p1@home.com 
           2   Tony                            Iommi                           p2@cell.com 
           3   Geezer                          Butler                          p3@home.com 
           4   John                            Osbourne                        -           

最佳答案

这听起来像是 row_number() 的工作:

select p.personId, p.firstName, p.lastName, pe.emailAddress
from Person p left outer join
     (select pe.*,
             row_number() over (partition by personId order by personId) as seqnum
      from PersonEmail pe
     ) pe
     on pe.personId = tmo.personId and seqnum = 1;

关于sql - DB2 返回第一个匹配项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36731289/

相关文章:

mysql - SQL 索引性能 - ASC 与 DESC

sql - 获取具有 max(timestamp) 的行

sql - 如何将新列添加到具有与同一个表对应的值的表中?

ibm-midrange - 当在我的程序中使用时,CPYTOPCD 仅复制一小部分信息,但当从命令行使用时,它会复制所有信息

sql - 仅返回具有最近 TIME 值的记录?

DB2 访问非唯一表中的特定行以进行更新/删除操作

php - 可以为用户 php 创建组

java - 使用 JTOpen 的 RPG (iSeries) 现代化 - 什么是可能的?

java - 使用 CL 或 RPGLE 在 IBM i 上以编程方式检查 java 版本

eclipse - 将 Web 项目从 Webshpere 7.0 迁移到 Eclipse Java EE IDE/Tomcat 8.0