我有两个表,emp
和location
。我需要根据位置类型获取emp表的所有匹配eid s'的记录。
如果位置类型= 2,那么我们需要获取与之关联的城市。
如果我们没有type = 2记录,我们需要为匹配的eid获取type = 1关联的城市。
我的case语句工作正常,直到有两个类型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
答案 0 :(得分:1)
试试这个:
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
答案 1 :(得分: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
表中的值(我只是不认为它是直观的)。
答案 2 :(得分:0)
您想要对您的城市进行排名。使用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
更高的城市。)