Mssql联合两个基于列值的表

时间:2014-08-20 15:55:54

标签: sql union

我必须同时携带客户数据的tabels(tab_a和tab_b)。这两个表有一些共同或更好的客户共同记录。问题是它们由不同的客户代码识别,并且同一客户的名称可能因桌子而异。他们唯一的共同关键是增值税号。 我需要的是一个记录集,来自两个表的客户,但没有重复。

我尝试了一个常规的UNION,但问题是如果客户的名字与一个tabel略有不同,那么我会得到一份副本。

我做空我需要

的结果
SELECT t1.vatnumber FROM tab_a AS t1 UNION t2.vatnumber FROM tab_b AS t2

但是对cusotmers的名字和他的客户代码(取自tab_a或如果tab_b中的tab_a不存在)的加入

真正感谢任何帮助。

此致

2 个答案:

答案 0 :(得分:1)

distinct你不会得到你想要的东西。更好的方法可能是union all聚合。以下内容返回您想要的内容 - 但没有优先权。也就是说,如果两个表中都存在名称或代码,则返回任意一个:

select vatnumber, max(name) as name, max(code) as code
from ((select a.vatnumber, a.name, a.code
       from tab_a
      ) union all
      (select b.vatnumber, b.name, b.code
       from tab_b
      )
     ) ab
group by vatnumber;

如果你想要优先权,那就有点麻烦了。这是一种方法:

select vatnumber,
       coalesce(max(case when which = 'a' then name end), max(name)) as name,
       coalesce(max(case when which = 'a' then code end), max(code)) as code
from ((select a.vatnumber, a.name, a.code, 'a' as which
       from tab_a
      ) union all
      (select b.vatnumber, b.name, b.code, 'b' as which
       from tab_b
      )
     ) ab
group by vatnumber;

答案 1 :(得分:0)

不要使用UNION,使用FULL OUTER JOIN会更简单:

SELECT 
ISNULL(a.vatnumber, b.vatnumber) vatnumber, 
ISNULL(a.name, b.name) name,
...
FROM tab_a a FULL JOIN tab_b b ON a.vatnumber = b.vatnumber 

语法取决于您使用的DB。例如这个例子应该适用于MSSQL。