联合三个表并显示数据来自何处

时间:2014-08-16 20:41:37

标签: sql union

不知道如何解决以下问题:

有三个表,每个表都有一列名称,例如

  • 表1 - 列名称'名称' - 价值观' A',' B'和' C'
  • 表2 - 列名'名称' - 价值观' A'和' B'
  • 表3 - 列nane'名称' - 价值观' A'和' C'

目标是UNION表 - 三个表的每个值只应显示一次。此外,应该有三个新的"虚拟列"显示包含值的表格(' 1'包含值时,' 0'如果不包含)。所以结果应该是这样的:

Value | Table1 | Table2 | Table3
--------------------------------
  A   |    1   |    1   |    1
  B   |    1   |    1   |    0
  C   |    1   |    0   |    1

希望有人可以帮助我,提前谢谢。

3 个答案:

答案 0 :(得分:3)

这样做你想要的吗?

select Name, max(Table1) as Table1, max(Table2) as Table2, max(Table3) as Table3
from (select Name, 1 as Table1, 0 as Table2, 0 as Table3
      from table1
      union all
      select Name, 0 as Table1, 1 as Table2, 0 as Table3
      from table2
      union all
      select Name, 0 as Table1, 0 as Table2, 1 as Table3
      from table3
     ) t
group by Name;

您可能希望使用sum()代替max()来获取每个表中值的出现次数。

答案 1 :(得分:0)

这是我的尝试(更新:在SQL-Server 2005及以上版本中起作用,因为 CTE ):

With names AS
(
   SELECT Name, Source = 'T1'
   FROM dbo.Table1

   UNION ALL

   SELECT Name, Source = 'T2'
   FROM dbo.Table2

   UNION ALL

   SELECT Name, Source = 'T3'
   FROM dbo.Table3
)
SELECT n.Name, 
       Table1 = CASE WHEN EXISTS
               (SELECT 1 FROM names n2 
                WHERE Source = 'T1' AND n2.Name=n.Name)
                THEN 1 ELSE 0 END,
       Table2 = CASE WHEN EXISTS
               (SELECT 1 FROM names n2 
                WHERE Source = 'T2' AND n2.Name=n.Name)
                THEN 1 ELSE 0 END,
       Table3 = CASE WHEN EXISTS
               (SELECT 1 FROM names n2 
                WHERE Source = 'T3' AND n2.Name=n.Name)
                THEN 1 ELSE 0 END
FROM names n
GROUP BY n.Name

Demo

答案 2 :(得分:0)

如果您的数据库支持完全加入,您可以尝试以下查询。

select
  coalesce(t1.Name,t2.Name,t3.Name) myValue,
  (case when max(t1.Name) is not null then 1 else 0 end) c1,
  (case when max(t2.Name) is not null then 1 else 0 end) c2,
  (case when max(t3.Name) is not null then 1 else 0 end) c3
from
  Table1 t1 
  full join Table2 t2 on t1.Name = t2.Name
  full join Table3 t3 on t1.Name = t3.Name
group by coalesce(t1.Name,t2.Name,t3.Name)

如果您知道某个值在每个表格中不会出现多次,则可以删除group bymax部分。