【问题标题】:How to merge recordsets with different fields如何合并具有不同字段的记录集
【发布时间】:2021-12-18 23:44:02
【问题描述】:

在 SQL 中,union 可用于将记录集(表或查询)的行附加到具有相同字段的另一个记录集。您还可以通过组合两者的字段并将null 值分配给没有这些字段的记录集中的行的字段来附加具有不同字段的记录集。

但是,如果每个记录集的值都对应于另一个记录集的键呢?然后将字段与任一记录集的所有 null 值组合不会给出正确的结果。

我需要在一个查询中合并两个具有不同字段的记录集。我的记录集是查询,但为了显示问题,我在这里将它们表示为表。这是 Access 中的设置:

我需要的是一个数据表,其中包含 Data_1Data_2(如果它们存在)的值,基于 ID1 和 ID2 的值:

ID1 ID2 Data_1 Data_2
1 1 A X
2 1 B
3 1 Y
4 1 C Z1
4 2 Z2

我正在尝试通过从ID1ID1_1ID1_2 执行left join 来做到这一点。这为我提供了 ID1 值 1、2 和 3 的正确输出。但我无法获得 ID1 = 4 两行的正确输出。

例如,SQL:

SELECT ID1, nz(ID2_1, ID2_2) AS ID2, Data_1, Data_2
FROM (ID1 LEFT JOIN Table_1 ON ID1.ID1 = Table_1.ID1_1) 
          LEFT JOIN Table_2 ON ID1.ID1 = Table_2.ID1_2
WHERE Data_1 Is Not Null OR Data_2 Is Not Null;

给我两行 ID1 = 4,但第二行是错误的:

和 SQL:

SELECT ID1, nz(ID2_1, ID2_2) AS ID2, Data_1, Data_2
FROM (ID1 LEFT JOIN Table_1 ON ID1.ID1 = Table_1.ID1_1) 
          LEFT JOIN Table_2 ON ID1.ID1 = Table_2.ID1_2
WHERE ID2_1 is not null and ID2_2 is null or
      ID2_1 is null and ID2_2 is not null or
      ID2_1 = ID2_2;

只给我一行ID1 = 4

我做错了什么?我需要做什么才能获得所需的输出?

【问题讨论】:

  • 您的问题不一定特定于 Access,但您的语法是。任何可能的答案都将受到 Access SQL 引擎的功能和语法限制。 Why should I “tag my RDBMS”?

标签: sql ms-access


【解决方案1】:

考虑:

SELECT Table_2.ID1_2, Table_2.ID2_2, Table_1.Data_1, Table_2.Data_2
FROM Table_2 LEFT JOIN Table_1 ON (Table_2.ID2_2 = Table_1.ID2_1) AND (Table_2.ID1_2 = Table_1.ID1_1)
UNION
SELECT Table_1.ID1_1, Table_1.ID2_1, Table_1.Data_1, Table_2.Data_2
FROM Table_1 LEFT JOIN Table_2 ON (Table_1.ID2_1 = Table_2.ID2_2) AND (Table_1.ID1_1 = Table_2.ID1_2);

======================

由提问者编辑:这个答案完美无缺,一旦你得到它,这是显而易见的事情之一,但当我试图弄清楚这一点时,我根本没有想到。所以我想解释一下它是如何工作的。

首先,不需要ID1 表,我让left join 来获取包括Table_n 表的所有行。

union 中的两个查询中的每一个都执行从一个 Table_n 到另一个的 left join。这包括左侧表的所有行,并从另一个表的该列插入一个新的Data_m 列,其中存在对应的值。这将创建一对可以union'd 的表,其中排除了重复的行,以产生所需的输出。

【讨论】:

  • 简单、优雅、明白了才明白。谢谢。
猜你喜欢
  • 2012-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-05
  • 2015-02-02
相关资源
最近更新 更多