【问题标题】:Access Removing CERTAIN PARTS of Duplicates in Union Query访问删除联合查询中重复的某些部分
【发布时间】:2014-12-23 04:14:43
【问题描述】:

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

但是,我的很多副本在一个条目中都有信息,而另一个条目中没有。这不是 100% 完全相同的副本。

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

我希望它合并这两个最终成为 A、B、C 的一行。

我在这里发现了一个类似的问题,但我根本不明白答案。任何帮助将不胜感激。

【问题讨论】:

  • 您找到解决问题的方法了吗?
  • 我现在对 SQL 的了解还不够,不知道自己在做什么。此外,我们在工作中的数据库正在朝着不同的方向发展。我真的很感谢你的帮助,希望有一天我能理解它:)
  • 没问题,我希望你的方向是远离访问。 :) 祝你好运。
  • 我应该使用/学习什么而不是访问?我已经收到了很多这样的评论,很想知道什么更好。谢谢!
  • 如果您正在模拟数据库或构建概念证明,那么访问是否很棒? .. 但它不能很好地扩展,并且如您所见,它不符合 ANSI sql 规范。如果您身处微软世界,请尝试 SQL Server。有一个免费版本可供开始。 MySql 是另一种流行的替代品。

标签: sql database duplicates ms-access-2007 union


【解决方案1】:

我建议这样的查询:

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 表示两行之间相同的列。从您的示例来看,它看起来像 A,但我不能确定。

【讨论】:

  • 谢谢,我是用VBA实现还是在联合查询的SQL视图中实现?
  • @msim 您将在 sql 视图中使用它代替联合查询。
  • 我终于有机会试试这个了。我需要将“t1”和“t2”更改为我的表格名称吗?我在示例中使用了 A、B、C,但我的字段有名称,所以我需要将它们放在 [] 括号中吗?我加入的所有列都是相同的,那么这会影响键值吗?很抱歉有很多问题,我很想更好地了解这一切。再次感谢。
  • @msim t1 和 t2 是别名。他们不需要更改,只需将table1table2 更改为您的表名。你不应该需要括号,除非你有一个包含空格的表或列名(应该避免这些)。如果每一列都可能有一个空值,那么您可能需要将它分成几部分,分别处理每一列。
【解决方案2】:

如果您的第一个表包含所有键值,那么您可以这样做:

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)

联合的第一部分获取第一个表中存在键值的行。第二个获取键值在第二个而不是第一个的行。

请注意,这在 Access 中比在其他(我敢说是“真实的”)数据库中困难得多。 MS Access 不支持公用表表达式 (CTE)、子查询中的 unions 或 full outer join——所有这些都有助于简化查询。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-06
    • 1970-01-01
    • 1970-01-01
    • 2021-08-12
    • 2021-09-09
    相关资源
    最近更新 更多