2017-05-02 4 views
1

Ich habe zwei Tabellen, emp und location. Ich muss die Datensätze für alle übereinstimmenden EIDs der Emp-Tabelle basierend auf dem Standorttyp abrufen.Case-Anweisung mit mehreren Joins

Wenn der Standorttyp = 2 ist, müssen wir die zugehörige Stadt abrufen.

Wenn wir nicht Typ = 2 Datensatz haben, müssen wir Typ = 1 assoziierte Stadt für die passende eid abrufen.

Mein Fall Anweisung funktioniert gut, bis es zwei Datensätze für die eid sowohl Typ 1 und Typ 2. Aber ich brauche nur Typ 2 in diesem Fall holen

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 
+0

Fügen Sie einige Beispieltabellendaten und das erwartete Ergebnis hinzu - alles als formatierter Text. – jarlh

+0

Hier ist ein großartiger Ort um anzufangen. http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/ –

+0

Verwenden Sie 'max (a.type)' mit der benötigten Gruppe von für Deine Wahl? und 'wo a.type in (1,2)' – xQbert

Antwort

1

ich denke, der direkteste Weg, um darzustellen, was Sie für fragen ist:

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 

der Unterabfrage-bas Die von Jeremy Real vorgeschlagene Lösung könnte auch funktionieren, aber sie geht davon aus, dass 1 und 2 nur Werte in der Tabelle für location.type sind (und ich finde es einfach nicht so intuitiv).

1

Versuchen Sie folgendes:

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 
+0

pls überprüfen Sie die Beispieldaten –

+0

@MunnaDonepudi Okay, ich habe es korrigiert. Ich denke, es wird jetzt funktionieren. –

0

Sie möchten Ihre Städte ranken. Verwenden Sie ROW_NUMBER zu tun, dass:

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 ist 1 für die bessere Stadt pro eid (wo „besser“ ist derjenige mit der höheren type).

Verwandte Themen