我必须同时携带客户数据的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不存在)的加入
真正感谢任何帮助。
此致
答案 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。