【问题标题】:Merge two different tables with Access使用 Access 合并两个不同的表
【发布时间】:2021-12-05 09:06:51
【问题描述】:

我想合并两个具有相似和不同列的不同表。唯一不同的列是:Amount-F21 和 A-21。我的问题是当我使用 Access 编写 SQL 请求(UNION ALL)时,它会删除 Amount A-21 列,但我需要这个。谢谢。

SELECT * FROM [Source Alloc-A21]
UNION ALL
SELECT * FROM [Source Alloc-F21]

【问题讨论】:

  • 它不会(不能)删除任何东西,但是一个字段只能有一个名称,并且是从第一个查询中选择的。用简单的选择查询替换表,在其中为两个不同的字段名称分配相同的别名。
  • 请拍下结果,通过结果看问题。
  • 只有在每个数据集中有相同数量的列并且数据类型兼容时才会运行(在必要时使用隐式数据类型强制) .然后,列名继承自第一个SELECTonly。来自后续SELECT 的数据由列位置而不是 名称分配。因此,如果您有SELECT a, b, F21 ... UNION ALL SELECT a, b, A21,则来自A21 的数据没有 被删除,它只会出现在F21 列中。如果您想覆盖它,只需避免使用* (无论如何这在生产代码中都是不好的做法)

标签: sql ms-access


【解决方案1】:

要将星号 Table.*UNION 一起使用,两个表中的列必须相等。如果不是,您需要选择单个列并为两个表中缺少的列提供默认值。

例如:

SELECT TableA.A, TableA.B, TableA.[Amount-F21], 0 AS [Amount-A21]
FROM TableA
UNION ALL
SELECT TableB.A, TableB.B, 0 AS [Amount-F21], TableB.[Amount-A21]
FROM TableB

这将为任何缺失的列(Amount-F21 或 A-21)报告 0。

然后您可以对结果求和以隐藏 (默认)值。

SELECT T.A, T.B, SUM(T.[Amount-F21]) AS [Amount-F21], SUM(T.[Amount-A21]) AS [Amount-A21]
FROM (
      SELECT TableA.A, TableA.B, TableA.[Amount-F21], 0 AS [Amount-A21]
      FROM TableA
      UNION ALL
      SELECT TableB.A, TableB.B, 0 AS [Amount-F21], TableB.[Amount-A21]
      FROM TableB
) AS T
GROUP BY T.A, T.B

【讨论】:

  • 另外,请注意,如果架构更改(添加列、重新排序列等),这仍然有效。但是,使用* 会导致代码易受模式更改的影响。作为一般规则,在生产代码中使用* 是不好的做法;总是明确的,就像在这个答案中一样。
  • @MatBailie 我不知道重新排序列仍然有效。谢谢你。
  • * 根据列在模式中的显示方式对列进行排序。通过按照您想要的顺序准确枚举您想要的列,您的答案并不关心或取决于它们在架构中出现的顺序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-29
  • 1970-01-01
  • 2014-04-10
  • 2014-01-22
  • 1970-01-01
  • 2019-12-24
  • 1970-01-01
相关资源
最近更新 更多