2010-11-15 5 views
2

je les entités suivantesrequête de jointure avec un résultat aplaties

alt text

AddressType est tout simplement un champ ENUM qui définissent si le courriel est Personnel/Travail/Autres.

Est-il possible de faire une requête qui renvoie un résultat aplati comme celui de l'exemple suivant?

CustomerID Full Name  Personal Email   Work Email 
----------- -------------- -----------------  ----------------------- 
1    John Doe  [email protected] [email protected] 
+1

+1 pour schéma pseudo-dessiné à la main; quel outil est-ce? – RedFilter

+1

'http: // yuml.me /' :) – Lorenzo

Répondre

1

Deux choix principaux:

1) Choisissez comme typique (avec deux lignes, une pour chaque e-mail), puis utilisez l'opérateur pivot pour aplatir.

Exemple de pivot (je l'appelle un exemple que je l'ai écrit dans le bloc-notes Il peut être un peu mal, mais il devrait vous indiquer la bonne voie.):

select 
    CustomerID, 
    FullName 
    [1] as WorkEmail, 
    [2] as HomeEmail 
from 
    (select 
    c.CustomerID, c.FullName, e.AddressText, e.AddressType 
    from 
    Customer c 
    join emails e on e.CustomerID = c.CustomerID) as Source 
pivot (
    AddressText 
    FOR AddressType in ([1], [2]) 
) 

2) Inscrivez-vous à la table e-mail deux fois, une fois pour chaque type d'adresse. Suggérer des jointures externes, donc s'il vous manque, vous obtenez toujours l'autre.

+0

Pouvez-vous me donner un échantillon du premier cas s'il vous plaît? Le second est clair mais ce serait un peu compliqué dans mon cas car les valeurs dans l'énumération sont sept ... Merci! – Lorenzo

2
select c.CustomerID, 
    c.FullName as [Full Name], 
    epersonal.AddressText as [Personal Email], 
    ework.AddressText as [Work Email] 
from Customer c 
left outer join Email epersonal on c.CustomerID = epersonal.CustomerID 
    and epersonal.AddressType = 'personal' 
left outer join Email ework on c.CustomerID = ework.CustomerID 
    and epersonal.AddressType = 'work' 
Questions connexes