1

嗨,我有如下表...

A (id,name) B(id,name) c(id,name)

现在我想获取每个表的名称,这样就不会有交叉产品表。即,总行数不会超过最大行数表。如果数据低于 exp

  对于表 A
身份证名称
1滴
2 阿米特
3 皮尤什
4 顶

对于表 B
身份证名称
1滴
4 顶

对于表 C
身份证名称
2 阿米特
3 皮尤什

然后输出应该如下所示

节点名_A 节点名_B 节点名_C
Dilip Dilip NULL
阿米特 NULL 阿米特
Piyush NULL Piyush
顶顶 顶顶 NULL

在此表中是包含 id 和节点的所有条目的基表,但其他表可能包含较少数量的条目或也可能包含重复条目。

请告诉我我该怎么做

4

3 回答 3

0

在连接中使用FULL JOINwith COALESCE

select nodename_A = A.name
  , nodename_B = B.name
  , nodename_C = C.name
from A
  full join B on A.id = B.id
  full join C on coalesce(A.id, B.id) = C.id
order by coalesce (A.id, B.id, C.id)

您可以在此处查看运行的代码示例:

SQL Fiddle 与演示

好的,根据我现在假设的新评论:

  1. 表 A 将包含所有名称记录。
  2. 其他表中可能存在重复项。

这个新查询将适用于上述场景:

select nodename_A = A.name
  , nodenameB = case when exists (select 1 from B where A.id = B.id) then A.name end
  , nodenameC = case when exists (select 1 from C where A.id = C.id) then A.name end
from A

新的 SQL Fiddle 演示,现在数据中有重复项。

希望这对你现在有用。

于 2013-01-31T12:40:59.767 回答
0

我认为几个外连接应该这样做:

Select a.name as aName, b.name as bName, c.name as cName
From A
LEFT join B on a.id = b.id
LEFT join C on a.id = c.id
于 2013-01-31T12:44:17.867 回答
0

枢轴技巧怎么样?

只是一个不同的解决方案..

我想完整的外连接解决方​​案更容易阅读

反正..

如果您真的想要每行的所有列中的名称相同,或者如果不存在则为 null

你应该做这样的事情

select * 
from(   select name as row
                      ,'Table A' as [table]
                      ,name
                 from [table A]

                union all              
                select name as row
                     ,'Table B' as [table]
                     ,name
                from [Table B]      

               union all 
               select name as row
                    ,'Table C' as [table]
                    ,name
               from [Table C]       
)V
PIVOT(max(v.name) for [table] in ([Table A],[Table B],[Table C]))P
order by row

结果集看起来像这样

Table A        Table B       Table C
Dilip           Dilip          NULL
Amit            NULL           Amit
Piyush          NULL           Piyush
Sumit           Sumit          NULL

如果您只想要每个表上的名称列表,

相同的名字不需要在同一行..应该做这样的事情

select * 
from(   select ROW_NUMBER() over (order by name) as row
                      ,'Table A' as [table]
                      ,name
                 from [table A]

                union all              
                select ROW_NUMBER() over (order by name) as row
                     ,'Table B' as [table]
                     ,name
                from [Table B]      

               union all 
               select ROW_NUMBER() over (order by name) as row
                    ,'Table C' as [table]
                    ,name
               from [Table C]       
)V
PIVOT(max(v.name) for [table] in ([Table A],[Table B],[Table C]))P
order by row

结果集看起来像这样

Table A        Table B       Table C
Amit            Dilip          Amit
Dilip           Sumit          Piyush
Piyush          NULL           NULL
Sumit           NULL           NULL
于 2013-01-31T15:10:49.383 回答