2016-04-19 108 views
2

在V6R1的DB2 for i(又名DB2/400)中,我想編寫一條SQL SELECT語句,它返回來自標題記錄的一些列和僅來自一個匹配詳細記錄的一些列。它可以是任何匹配記錄,但我只需要其中一個信息。我可以用下面的查詢來完成這個任務,但是我認爲必須比使用WITH子句更簡單。如果我需要它,我會使用它,但我一直在想,「必須有一個更簡單的方法」。基本上,我只是從Person表中返回firstName和lastName ...加上PersonEmail表中的一個匹配電子郵件地址。DB2返回第一個匹配

謝謝!

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       [email protected] 
      2 Tony       Iommi       [email protected] 
      3 Geezer       Butler       [email protected] 
      4 John       Osbourne      -   

回答

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; 
+0

謝謝,@戈登 - linoff!這工作很好。你是一個強大而有才華的人! – DaveSlash

+0

@DaveSlash,如果答案有效,不要忘記標記它。 –

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