Déclaration de cas avec plusieurs jointures

J'ai deux tables, emp et location . J'ai besoin de récupérer les loggings pour tous les eid s 'correspondants de la table emp en fonction du type d'location.

Si le type de lieu = 2, nous devons aller chercher la ville qui lui est associée.

Si nous n'avons pas d'logging type = 2, nous devons récupérer la ville associée à type = 1 pour l'eid correspondant.

Ma déclaration de cas fonctionne bien jusqu'à ce qu'il y ait deux loggings pour l'eid de type 1 et de type 2. Mais je n'ai besoin de récupérer que le type 2 dans ce cas

 select case when a.type=2 then a.city When a.type=1 then a.city Else '0' End As City From location a Join emp r On a.eid=r.eid emp table eid ename 1 james 2 mark 3 kristie 4 john 5 allen location table city eid type athens 1 2 melbourne 2 1 london 2 2 newyork 3 1 output: eid ename city type 1 james athens 2 2 mark london 2 3 kristie newyork 1 

Je pense que la façon la plus directe de représenter ce que vous requestz est:

 select coalesce(l2.city, l1.city, '0') as city From emp r left join location l1 on l1.eid = r.eid and l1.type=1 left join location l2 on l2.eid = r.eid and l2.type=2 

La solution basée sur la sous-requête proposée par Jeremy Real peut également fonctionner, mais elle suppose que 1 et 2 sont uniquement des valeurs dans la table pour location.type (et je ne trouve pas cela aussi intuitif).

Essaye ça:

 select a.eid ,r.ename ,case when a.type=2 then b.city when a.type=1 then b.city else '0' End As City from ( select a.eid, max(a.type) as type From location a group by a.eid ) a right outer join location b on a.eid = b.eid and a.type=b.type inner join emp r on b.eid=r.eid 

Vous voulez classr vos villes. Utilisez ROW_NUMBER pour cela:

 select e.eid, e.name, l.city, l.type from emp e join ( select city, eid, type, row_number() over (partition by eid order by type desc) as rn from location ) l on l.eid = e.eid and l.rn = 1; 

rn est 1 pour la meilleure ville par eid (où "mieux" est celui avec le type supérieur).