如果存在重复项,请根据另一列选择值

时间:2016-07-01 15:36:48

标签: sql ms-access ms-access-2013

我有一大堆邮政编码和地区,我从两个不同的数据源合并。

我的列看起来像: 邮政编码,领土,来源

值可能如下所示:

76345, ShiPaTown, Source1
76345, ShiPaTown, Source2
12110, South Park, Source1
12110, Mars, Source2

我的目标是每个唯一的邮政编码只有一行,如果在源码1和源码2中有邮政编码的记录,则始终从源1获取区域。

因此,之前的列表将缩减为:

76345, ShiPaTown
12110, SouthPark

3 个答案:

答案 0 :(得分:3)

这是优先级查询。这是一种方法:

select zip, town
from t
where source = 'source1'
union all
select zip, town
from t
where source = 'source2' and
      not exists (select 1 from t as t2 where t2.zip = t.zip and t2.source = 'source1');

答案 1 :(得分:2)

假设每个zipcode有两个或一个记录,那么您可以使用以下查询:

SELECT t1.zipcode, 
       IIF(ISNULL(t2.territory), t1.territory, t2.territory) AS territory,
       IIF(ISNULL(t2.source), t1.source, t2.source) AS source
FROM mytable AS t1
LEFT JOIN (
   SELECT zipcode, territory, source
   FROM mytable
   WHERE source = 'Source1') AS t2 ON t1.zipcode = t2.zipcode
WHERE t1.source <> 'Source1'

Demo here

答案 2 :(得分:1)

如果每个来源中的邮政编码都是唯一的(在任何一个来源中都没有重复,尽管它们可能重叠)并且您可以重新合并数据,我会从源1创建您的表,然后将zip设为主键(不会重复允许),然后附加来自源2的数据。这是一个手动解决方法,但只有2个来源,它可能是可行的。