我有以下表格“Base”和“Join”:
Base:
ID Field
A 1
B 2
D
Join:
ID
A
B
C
D
我使用以下选择查询“ExampleQuery”来解析“Base”:
SELECT Base.ID, IIf(IsNull([Field]),"None",[Field]) AS Newfield
FROM Base;
以下选择查询左连接表“Join”以查询“ExampleQuery”:
SELECT Join.ID, ExampleQuery.Newfield
FROM [Join] LEFT JOIN ExampleQuery ON Join.ID = ExampleQuery.ID;
我的输出如下:
ID Newfield
A 1
B 2
C None
D None
我期望C的值为null,因为它不存在于ExampleQuery的输出中,但是它使用的是原始查询中表达式的逻辑。是什么导致这种情况发生,我该如何预防呢?我想将我的初始选择查询严格地视为临时表。
答案 0 :(得分:1)
您可以尝试加入子查询,该子查询首先用<script>
替换Base
表中缺少的字段值:
None
顺便说一句,SELECT t1.ID, t2.Newfield
FROM [Join] t1
LEFT JOIN
(
SELECT ID, IIF(ISNULL([Field]),"None", [Field]) AS Newfield
FROM Base
) t2
ON t1.ID = t2.ID;
是Access中的保留关键字(可能是SQL的每个其他版本)。您应该避免使用关键字命名表,列等。
答案 1 :(得分:0)
这种情况正在发生,因为字段有两种方式可以为null:它可以为null,因为有一个记录,其中该字段为空,或者可能是因为它没有匹配的记录,外部连接为找到。
听起来好像你已经在查询中添加了另一个表,而不是像你所说的那样将整个查询加入到表中。我认为要解决这个问题,你需要做你所描述的,即外连接整个查询。在Access中,可以通过从返回
的查询开始实现ID NewField
A 1
B 2
D None
并将其保存为例如Query1。然后,您将创建一个新查询,并包含Query1(Access将其视为表格),然后将其连接到您的其他表。
答案 2 :(得分:0)
在实际解决之前,我通过向表达式添加另一个条件找到了解决方法。如果我改变&#34; ExampleQuery&#34;到:
SELECT Base.ID, IIf(IsNull([Field]) And Not IsNull([ID]),"None",[Field]) AS Newfield
FROM Base;
然后,当我运行后续查询匹配时,我得到了我想要的输出&#34; ExampleQuery&#34;到表&#34;加入&#34;:
ID Newfield
A 1
B 2
C
D None