2016-04-19 9 views
2

V6R1のDB2 for i(a.k.a. DB2/400)では、ヘッダーレコードの一部の列と一致する詳細レコードの一部の列を返すSQL SELECTステートメントを作成します。一致するレコードはどれでもかまいませんが、私はそれらのうちの1つからの情報しか必要としません。私は以下のクエリでこれを達成することができますが、私はWITH句を使用するより簡単な方法があると考えています。私が必要な場合はそれを使用しますが、私は考えています。「もっと簡単な方法が必要です。本質的に、私はPersonテーブルからfirstNameとlastNameを返すだけです...さらに、PersonEmailテーブルから一致する電子メールアドレスのうちの1つを返します。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]m 
      2 Tony       Iommi       [email protected] 
      3 Geezer       Butler       [email protected] 
      4 John       Osbourne      -   

答えて

3

これはrow_number()のための仕事のように聞こえる:行はPersonEmailファイルが本当に重要ではないから選択される

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

ありがとう!それは美しく働いた。あなたは強力で才能のある人です! – DaveSlash

+0

@DaveSlash、その答えが働いた場合は、マークすることを忘れないでください。 –

3

た場合には、要約、クエリのいずれか、または実行する理由はほとんどありませんその行を選択するためのOLAPクエリ。順序付けは、前者のCTEのMIN集約に暗示され、後者では順序が明示的に要求されます。 FETCH FIRST句を次のように使用すると、セカンダリ・ファイルのデータのORDERを指定する必要はありません。いえさえ]キーを使用しなくなる可能性があるクエリの実装に完全に依存しているが、PERSONIDキーに応じて、最初または最後の可能性が高い:ゴードン・linoff @、

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 
関連する問題