【问题标题】:Expression from one query being pulled into subsequent query来自一个查询的表达式被拉入后续查询
【发布时间】:2018-01-11 00:00:32
【问题描述】:

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

【问题讨论】:

  • 请向我们展示用于生成此输出的查询。一些样本数据也会很好。
  • 我已经修改了我最初的问题,希望这有助于解决问题。

标签: sql ms-access


【解决方案1】:

您可以尝试加入一个子查询,该子查询首先将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;

顺便说一句,JOIN 是 Access 中的保留关键字(可能还有其他 SQL 版本)。您应该避免使用关键字来命名表、列等。

【讨论】:

  • 我不确定这是否适用于标准 SQL,但在 Access 中我得到相同的结果,C 的值为“无”。是的,就我而言,命名约定的选择很糟糕。
  • @ChrisDecker 我不明白为什么我的查询不起作用。我将设置一个演示。
【解决方案2】:

发生这种情况是因为该字段有两种可能为空的方式:它可能是空的,因为存在该字段为空的记录,或者可能是因为外部连接根本没有匹配的记录找到。

听起来您确实在查询中添加了另一个表,而不是像您所说的那样将整个查询加入到一个表中。我认为要解决此问题,您需要执行您所描述的操作,即外部连接整个查询。在 Access 中,这可以通过从返回的查询开始来实现

ID  NewField
A   1
B   2
D   None

并将其保存为,例如,Query1。然后,您将创建一个新查询,并包含 Query1(Access 将其视为一个表),然后将其外部连接到您的另一个表。

【讨论】:

    【解决方案3】:

    在实际解决之前,我通过向表达式添加另一个条件找到了解决方法。如果我将“ExampleQuery”更改为:

    SELECT Base.ID, IIf(IsNull([Field]) And Not IsNull([ID]),"None",[Field]) AS Newfield
    FROM Base;
    

    然后,当我运行将“ExampleQuery”匹配到表“Join”的后续查询时,我得到了我想要的输出:

    ID  Newfield
    A   1
    B   2
    C   
    D   None
    

    【讨论】:

    • 克里斯,如果您想回答自己的问题,您至少应该发布整个查询。
    • 我不知道是否应该将其添加为答案或将其附加到我最初的问题中,但我只是想注意这个解决方法,以防其他人遇到我同样的问题。你是对的,对不起,我只是发布了表情。我将修改以显示整个查询。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-08
    • 1970-01-01
    相关资源
    最近更新 更多