2015-03-13 98 views
4

我有TAB1与以下数据结合2列从2个表合并到一列

ID | Name 
1 | furniture 
2 | Electronic 
3 | Books 

TAB2作为

foreignkeyID |名称

1   | sofa 
1   | chair 
3   | c# 
3   | sql 
2   | fan 
2   | tv 

我想结果集作为

Name 
furniture 
sofa 
chair 
Electronic 
FAN 
TV 
Books 
c# 
sql 

我使用光标实现上述结果集,while循环,我怎么会得到渴望输出,而不循环

回答

1

一个简单UNION可以做工作。或者有些不同,你可以使用recursive CTE。正常情况下,当存在多个级别时,使用递归CTE,但没有理由不能使用相同的技术仅用于1级。

declare @t1 table (id int, category varchar(100)) 
insert @t1 values (1, 'furniture'), (2, 'Electronic'), (3, 'Books') 

declare @t2 table (id int, item varchar(100)) 
insert @t2 values (1, 'sofa'), (1, 'chair'), (3, 'c#'), (3, 'sql'), (2, 'fan'), (2, 'tv') 

-- Approach 1 : UNION 

; with cte as (
    select 
     id, 0 as level, category as name 
    from 
     @t1 
    union all 
    select 
     id, 1 as level, item as name 
    from 
     @t2 
) 
select 
    name 
from 
    cte 
order by 
    id, level 

-- Approach 2 : Recursive CTE 

; with cte as (
    select 
     id, category as name, 0 as level 
    from @t1 
    union all 
    select 
     t2.id, t2.item, level + 1 
    from 
     @t2 t2 
      inner join cte on cte.id = t2.id 
         and level = 0 
) 
select 
    name 
from 
    cte 
order by 
    id, level 
4

试试这个,

Declare @tab1 table(ID int, Name varchar(40)) 
insert into @tab1 values(1 ,'furniture') 
,(2,'Electronic'),(3,'Books') 

declare @tab2 table(foreignkeyID int, Name varchar(40)) 
insert into @tab2 values 
(1,'sofa'), 
(1,'chair'),(3,'c#'),(3,'sql'), 
(2,'fan'),(2,'tv') 

select name from 
(select 1 rn, id, name from @tab1 
union all 
select 2, foreignkeyID, name from @tab2 
)t4 
order by id,rn