DB2返回第一个匹配

时间:2016-04-19 23:35:29

标签: sql ibm-midrange db2-400

在V6R1的DB2 for i(a.k.a。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                        -           

2 个答案:

答案 0 :(得分:3)

这听起来像是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;

答案 1 :(得分:3)

如果从PersonEmail文件中选择哪一行真的无关紧要,那么没有理由执行摘要查询或OLAP查询来选择该行;根据CTE的MIN聚合在前者中隐含排序,并且在后者中明确要求订单。以下使用FETCH FIRST子句就足够了,对辅助文件中的数据ORDER没有任何要求[仅仅是任何匹配的行;虽然可能是第一个或最后一个,取决于personId键,虽然完全依赖于查询实现,甚至可以不使用密钥]:

  select p.personId, p.firstName, p.lastName 
       , pe.emailAddress 
  from Person as p 
  left outer join lateral 
     ( select pe.* 
       from PersonEmail pe 
       where pe.personId = p.personId 
       fetch first 1 row only 
     ) as pe 
  on p.personId = pe.personId