我有两个表emp
和location
。我需要根据位置类型获取EMP表的所有匹配的Eid S'的记录。
如果位置类型= 2,那么我们需要获取与之相关的城市。
如果我们没有类型= 2记录,我们需要为匹配的开斋节获取类型= 1相关的城市。
我的案例语句正常工作,直到有两个类型和类型2的EID记录。但是我需要在这种情况下仅获取类型2
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
我认为表示您要的最直接方法是:
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
Jeremy Real提出的基于子查询的解决方案也可能起作用,但假设1和2是location.type
的表中的值(我只是发现它是直观的(。
尝试以下:
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
您想对城市进行排名。使用ROW_NUMBER
来做到这一点:
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
对于每个 eid
的更好城市为1(其中"更好"是较高的 type
(。