【发布时间】:2021-12-18 23:44:02
【问题描述】:
在 SQL 中,union 可用于将记录集(表或查询)的行附加到具有相同字段的另一个记录集。您还可以通过组合两者的字段并将null 值分配给没有这些字段的记录集中的行的字段来附加具有不同字段的记录集。
但是,如果每个记录集的值都对应于另一个记录集的键呢?然后将字段与任一记录集的所有 null 值组合不会给出正确的结果。
我需要在一个查询中合并两个具有不同字段的记录集。我的记录集是查询,但为了显示问题,我在这里将它们表示为表。这是 Access 中的设置:
我需要的是一个数据表,其中包含 Data_1 和 Data_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 |
我正在尝试通过从ID1 到ID1_1 和ID1_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”?