J'ai deux champs avec une adresse e-mail dans la table #data que j'essaie de rejoindre. Je souhaite qu'il rejoigne l'adresse e-mail du représentant et si cela ne fonctionne pas, je souhaite qu'il se joigne par e-mail. J'ai essayé d'exécuter la requête suivante:

select a.*
from #data a
join #email b on b.email=coalesce(a.rep_email_address,a.email) 
where a.rep_email_address<>a.email

Cela ne fonctionne cependant pas, car dans le cas où a.rep_email_adress n'est pas nul mais ne correspond pas à b.email, il supprimera l'enregistrement au lieu de prendre le champ a.email.

Voici le contournement que j'ai trouvé:

select a.*
from #data a
join #email b on a.email=b.email
except 
select a.*
from #data a
join #email b on a.rep_email_address=b.email
union
select a.*
from #data a
join #email b on a.rep_email_address=b.email 
where a.rep_email_address<>a.email

Ceci cependant, est loin d'être optimal, donc je me demande: comment écrire ceci pour être plus performant / avoir l'air plus propre ou plus simple? Juste pour clarifier, cette requête fonctionne (la deuxième requête), je me demande s'il existe une meilleure façon de l'écrire.

Je vous remercie!

0
edost4 26 juil. 2017 à 00:12

2 réponses

Meilleure réponse

Cela devrait être beaucoup plus simple. Cependant, je vous recommande également de vérifier le plan d'exécution de cette requête pour vous aider à analyser si cela est plus optimal. [Ou comparez simplement les temps d'exécution résultants sur vos tables]

SELECT a.*
   FROM #data a
       JOIN #email b 
           ON (a.rep_email_address = b.email
               OR a.email = b.email )
WHERE a.rep_email_address<>a.email; 
# Not sure why or IF you need this where clause specifically.
3
DeadLock 25 juil. 2017 à 21:29

Essayez-le comme ça ...

SELECT
    a.*,
    SomeColumn = ISNULL(e1.SomeColumn, e2.SomeColumn)
from 
    #data a
LEFT JOIN #email e1
    ON e1.email = a.rep_email_address
LEFT JOIN #email e2 
    ON e2.email = a.email
    AND e1.email IS NULL 
WHERE 
    a.rep_email_address <> a.email
    AND (
            e1.email IS NOT NULL
            OR 
            e2.email IS NOT NULL
        );

HTH, Jason

1
Jason A. Long 25 juil. 2017 à 21:22