带有多个连接的案例声明



我有两个表emplocation。我需要根据位置类型获取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(。

相关内容

  • 没有找到相关文章

最新更新