2017-10-11 59 views
1

我要求如何获取数据使用联接或交叉应用

样本数据: 表A:

ID name 
1 cat 
2 Dog 
3 Bird 

表B:

ID name 
1 aaa 
1 bbb 
2 ccc 
2 ddd 

表C:

ID name 
1 xxx 
1 yyy 
1 zzz 
2 www 

要求ED输出:

ID name name name 
1 cat aaa xxx 
1 cat bbb yyy 
1 cat null zzz 
2 Dog ccc www 
2 Dog ddd www 
3 Bird NULL NULL 

我有不同的尝试加入

Select a.ID,a.name,b.name,c.name from @A a 
full join @b b 
on a.ID = b.ID 
full join @c c 
on b.ID = c.ID 

任何人都可以建议我,最好的方法?

+0

背后的逻辑是什么?你想达到什么目的? –

+0

解释输出背后的逻辑。另外,请理解RDBMS中没有行的隐式顺序。 – GurV

+0

我无法得到这个逻辑,这是我在这里发布的原因,以及我已经清楚地给出了数据和输出的原因。我询问了建议 – mohan111

回答

5

您可以使用窗口函数row_number指定为表bc增加name的顺序为每个id内的序列号,然后做一个全面它们之间的连接。最后,不要左联同a表:

with b1 as (
    select b.*, row_number() over (partition by id order by name) as rn 
    from b 
    ), 
c1 as (
    select c.*, row_number() over (partition by id order by name) as rn 
    from c 
    ) 
select a.*, t.b_name, t.c_name 
from a 
left join (
    select coalesce(b1.id, c1.id) as id, 
     b1.name as b_name, 
     c1.name as c_name 
    from b1 
    full join c1 on b1.id = c1.id 
     and b1.rn = c1.rn 
    ) t on a.id = t.id; 

这是假设你需要加入表b和基于ID和位置(name列的顺序)c

+0

完美满足需求 – mohan111

+0

也许这是唯一的原因,阅读堆栈溢出比浪费Facebook的时间更有用。 @GurV,能否请你多解释一下你在这里使用的逻辑。我也需要在我的项目中实现相同的逻辑。提前致谢。 –