Sql Access在联合查询中删除重复项的某些部分

Sql Access在联合查询中删除重复项的某些部分,sql,database,duplicates,ms-access-2007,union,Sql,Database,Duplicates,Ms Access 2007,Union,我在Access 2007工作,对SQL和VBA一无所知。我正在尝试执行联合查询以联接两个表,并删除重复的表 但是,我的很多复制品在一个条目中有信息,而在另一个条目中没有。它不是100%完全相同的 例如, 第1行:A、B、空白 第2行:A,空白,C 我希望它合并这两个元素,最终成为A,B,C的一行 我在这里发现了一个类似的问题,但我根本不明白答案。非常感谢您的帮助。我建议您提出以下问题: select coalesce(t1.a, t2.a) as a, coalesce(t1.b, t

我在Access 2007工作,对SQL和VBA一无所知。我正在尝试执行联合查询以联接两个表,并删除重复的表

但是,我的很多复制品在一个条目中有信息,而在另一个条目中没有。它不是100%完全相同的

例如, 第1行:A、B、空白 第2行:A,空白,C

我希望它合并这两个元素,最终成为A,B,C的一行


我在这里发现了一个类似的问题,但我根本不明白答案。非常感谢您的帮助。

我建议您提出以下问题:

select
  coalesce(t1.a, t2.a) as a,
  coalesce(t1.b, t2.b) as b,
  coalesce(t1.c, t2.c) as c
from
  table1 t1
  inner join table2 t2 on t1.key = t2.key

在这里,我使用了关键字coalesce。这将获取值列表中的第一个非空值。还要注意,我使用key表示两行之间相同的列。从您的示例来看,它看起来像一个,但我不能确定。

如果您的第一个表包含所有键值,则可以执行以下操作:

select t1.a, nz(t1.b, t2.b), nz(t1.c, t2.c) as c
from table1 as t1 left join
     table2 as t2
     on t1.a = t2.a;
如果不是这样,您可以使用这个看起来相当神秘的构造:

select t1.a, nz(t1.b, t2.b), nz(t1.c, t2.c) as c
from table1 as t1 left join
     table2 as t2
     on t1.a = t2.a
union all
select t2.a, t2.b, t2.c
from table2 as t2
where not exists (select 1 from table1 as t1 where t1.key = t2.key)
联合的第一部分获取第一个表中有键值的行。第二个获取键值位于第二个而不是第一个的行


注意,这在访问中比在其他我敢说是真实数据库中要困难得多。MS Access不支持通用表表达式CTE、子查询中的联合或完全外部联接-所有这些都有助于简化查询。

谢谢,我是用VBA实现的还是在联合查询的SQL视图中实现的?@msim您将在SQL视图中使用它来代替联合查询。我终于有机会尝试一下了。是否需要将t1和t2更改为表的名称?我使用A、B、C作为示例,但是我的字段有名称,所以我需要将它们放在[]括号中吗?我要连接的所有列都是相同的,这会影响键值吗?抱歉问了这么多问题,我很想更好地理解这一切。再次感谢。@msim t1和t2是别名。他们不需要更改,只需将表1和表2更改为您的表名即可。除非您的表名或列名中有空格,否则不应该使用括号,应该避免使用空格。如果每一列中都有一个空值,那么您可能需要将它分成若干部分,分别处理每一列。您能找到解决问题的方法吗?我对SQL的了解还不够,不知道我在做什么。此外,我们正在朝着数据库工作的另一个方向前进。我真的非常感谢您的帮助,希望有一天我能理解:没问题,我希望您的方向是远离访问祝你好运。我应该使用/学习什么来代替访问?我已经收到了很多这样的评论,我很想知道什么更好。谢谢如果你正在模拟一个数据库,或者建立一个概念验证,那么Access是非常棒的。。但它不能很好地扩展,正如您所看到的,它不符合ANSI sql规范。如果您在microsoft世界,请尝试SQL Server。有一个免费版本可供开始。MySql是另一种流行的替代方案。