2016-05-19 5 views
0

Es tut mir leid um den Titel, ich bin mir nicht sicher, wie zu fragen. Ich habe Tabellen, Entity und E-Mail, das ist eine Beziehung von eins zu viele.Wie Abfrage, eine zu viele Beziehung, denormalize

Mein Code ist

select e.pref_mail_name, em.email_address 
from entity e 
left join email em ON em.id_number = e.id_number 

Dann Ausgabe wie dieser ist

pref_mail_name --------------- em.email_address 
jsmith       [email protected] 
El Alex       [email protected] 
EL ALex       [email protected] 
EL Alex       [email protected] 
Jay smith      [email protected] 

Ich möchte diese

zeigen, wie
pref_mail_name ----em.email_address1---em.email_address2--em.email_address3 
    jsmith    [email protected] 
    El Alex   [email protected]  [email protected]  [email protected] 
    Jay smith   [email protected] 

Wie kann ich eine Abfrage schreiben, wie ein Echo aus über?

+0

Möchten Sie Beschränkung auf 3 E-Mail-Adressen? Wenn nicht, können Sie eine Aggregatfunktion ('LISTAGG' oder' XMLAGG') verwenden, um eine verkettete Liste von E-Mail-Adressen zu erstellen. – Stavr00

Antwort

0

Wenn Sie nur statische Spalten möchten, können Sie die folgende Methode verwenden, die die Vorteile der Leitfunktion übernimmt (Sie auch Verzögerung nutzen könnten und umgekehrt die Sortierung):

select e.pref_mail_name, em.email_address1, em.email_address2, em.email_address3 
from entity e 
left join (
    select 
     id_number, 
     rank() over (partition by id_number order by email_address asc) as email_rank, 
     lead(email_address,0,null) over (partition by id_number order by id_number, email_address asc) as email_address1, 
     lead(email_address,1,null) over (partition by id_number order by id_number, email_address asc) as email_address2, 
     lead(email_address,2,null) over (partition by id_number order by id_number, email_address asc) as email_address3 
    from email 
) em 
    ON em.id_number = e.id_number 
    AND em.email_rank = 1 
0
SELECT 
    e.pref_mail_name 
    ,max(case when rn=1 then email_address end) email_1 
    ,max(case when rn=2 then email_address end) email_2 
    ,max(case when rn=3 then email_address end) email_3 
FROM entity e LEFT JOIN 
    (select email_address, id_number 
      ,row_number() over (partition by id_number order by 2) rn from email) em 
ON (e.id_number=em.id_number) 
GROUP by pref_mail_name, 2; 
Verwandte Themen