具有多个联接的案例声明

时间:2017-05-02 14:10:24

标签: sql sql-server

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

3 个答案:

答案 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更高的城市。)