将一个查询的表达式拉入后续查询中

时间:2018-01-11 00:00:33

标签: sql ms-access

我有以下表格“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的输出中,但是它使用的是原始查询中表达式的逻辑。是什么导致这种情况发生,我该如何预防呢?我想将我的初始选择查询严格地视为临时表。

3 个答案:

答案 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