SQL - 根据同一个表中的另一行获取相应的列

时间:2014-10-22 12:17:56

标签: sql sql-server-2012 self-join

我有下表:

id    u_Id   Ref    c_type
1      1    ref1      c
2      1    ref2      c
3      1    ref3      m

我需要做的是对于同一个uid(在这种情况下为1),其中group_id为c,得到group_id为m的相应行。因此,对于id 1和2列,我需要从id为3的行获取ref。

我试过这个并且似乎有效但我想知道是否还有其他更短的版本:

Declare @temp table (id int, u_id int, ref varchar(10), c_type varchar(1))

insert into @temp 
select 1, 1, 'ref1', 'c' union all
select 2, 1, 'ref2', 'c' union all
select 3, 1, 'ref3', 'm'

;with b as
(
    select * from @temp
    where c_type = 'c'
),
x as
(
    select * from @temp
    where c_type = 'm'
)
select distinct x.u_id,x.c_type,x.ref from b,x
where x.u_id = b.u_id

预期结果

id    u_Id   Ref    c_type    ref
1      1    ref1      c      ref3
2      1    ref2      c      ref3

1 个答案:

答案 0 :(得分:1)

您可以使用窗口功能执行此操作:

select t.*,
       max(case when c_type = 'm' then id end) over (partition by u_id) as m_id;
from @temp t;

如果您只想要ref列:

select t.*,
       max(case when c_type = 'm' then ref end) over (partition by u_id) as m_ref;
from @temp t;

如果您需要该行中的其他值,则可以在join中输入:

select t.*, tm.*
from (select t.*,
             max(case when c_type = 'm' then id end) over (partition by u_id) as m_id;
      from @temp t
     ) t left join
     @temp tm
     on t.m_id = tm.id;