【问题标题】:My MS Access query of a query is not returning rows that have a null value in a field我的 MS Access 查询未返回字段中具有空值的行
【发布时间】:2013-01-03 02:13:08
【问题描述】:

我有一个名为 qry_sub_Loop 的查询,它使用左连接,并且作为左连接的结果,在名为 Next_Home_Stop 的派生字段中有一个空值。

我在基于 qry_sub_Loop 的其他查询中遇到问题。

作为隔离问题的测试,我尝试过:

  1. 从 qry_sub_Loop 中选择 *,其中 Next_Home_Stop 为空
  2. select * from qry_sub_Loop where Asset='C-5M-000001'

C-5M-000001 是一个资产,在 Next_Home_Stop 的某些行中具有某些值,而在其他行中具有 null

查询 1) 不返回任何记录。查询 2) 只返回 Asset='C-5M-000001' 且 Next_Home_Stop 不为空的行。


表:到达 - MissionID(文本) - 到达时间(双) - 出发时间(双) - 出发地点(文字) - 到达地点(文字) - 资产(文本) 表:飞机 - 资产(文本), - 主页(文字)

查询:

select
    aircraft.Home, aircraft.Asset, arrival.DepartureTime,
    min(arrival_1.ArrivalTime) as Next_Home_Stop,
    max(arrival_2.ArrivalTime) as LastStop
From
    arrival as arrival_1
    right join ((aircraft
                 inner join arrival 
                    on arrival.DepartureLocation = aircraft.Home and
                       arrival.Asset = aircraft.Asset)
          inner join arrival as arrival_2
             on arrival_2.Asset = arrival.Asset and
                arrival_2.ArrivalTime > arrival.DepartureTime) 
        on arrival_1.Asset = arrival.Asset and
           arrival_1.ArrivalTime > arrival.DepartureTime and
           arrival_1.ArrivalLocation = arrival.DepartureLocation
group by ... 

【问题讨论】:

  • 您能告诉我们表格结构(哪些字段在哪个表格中)以及您是如何连接表格的。如果没有看到查询,很难说出为什么会发生这种情况。
  • 把你的表格截图放上数据
  • 我无法进行屏幕截图,因为查询位于使用受限的单机上
  • 表:到达字段:MissionID(文本),ArrivalTime(双),DepartureTime(双),DepartureLocation(文本),ArrivalLocation(文本),资产(文本)表:飞机字段:资产(文本), 主页(文本)
  • qry:选择aircraft.Home,aircraft.Asset,arrival.DepartureTime,min(arrival_1.ArrivalTime)作为Next_Home_Stop,max(arrival_2.ArrivalTime)作为LastStop从抵港作为抵港1右加入((飞机内在到达时加入到达.DepartureLocation=aircraft.Asset 和到达.Asset=aircraft.Asset) 在到达_2.Asset=arrival.Asset 和到达_2.ArrivalTime>arrival.DepartureTime) 上到达_1.Asset=arrival.Asset 和arrival_1.ArrivalTime>arrival.DepartureTime 和arrival_1.ArrivalLocation=arrival.DepartureLocation group by ...

标签: ms-access null


【解决方案1】:

检查qry_sub_Loop 返回的Next_Home_Stop 值。

SELECT DISTINCT Next_Home_Stop FROM qry_sub_Loop;

该查询是否返回 Null?我的猜测是否定的,因为您说查询 #2 返回的值不是 Null。因为Next_Home_Stop实际上是min(arrival_1.ArrivalTime),所以不能同时包含Null和非Null值。

Min(ArrivalTime) 只能在两种情况下返回 Null:

  1. 所有 ArrivalTime 值均为 Null。
  2. 现在有行供 Min() 评估。

如果ArrivalTime 包含任何非 Null 值,Min() 将忽略 Null 值并为您提供最小的非 Null 值。

【讨论】:

  • 选择不同的查询没有返回任何空值。该列的 qry_sub_Loop 中有空值。到达表中没有空值。 qry_sub_Loop 中的空值是外连接条件的结果,尤其是arrival_1.ArrivalLocation=arrival.DepartureLocation
【解决方案2】:

因为连接行中的 NULL 值查询处理的后期放置到结果集中,因此您无法测试它们在查询本身中作为 NULL 值。

因此,对于检索 null 值,您可以这样做

     SELECT * FROM qry_sub_Loop 
     where 
     Next_Home_Stop 
     NOT IN               //you have to explicitly look for null
     (select Next_Home_Stop from qry_sub_Loop );

【讨论】:

  • 当我执行此查询时,我收到“条件表达式中的数据类型不匹配”错误
【解决方案3】:

我不知道这是否适用于您的查询,但是当您在外部表上有条件时会出现外部联接的常见问题

SELECT *
FROM
   A
   LEFT JOIN B
       ON A.X = B.X
WHERE
   B.Y = 'something'

此查询永远不会为表 B 生成空行,因为它们的条件不会满足。在连接条件中包含条件就可以了:

SELECT *
FROM
   A
   LEFT JOIN B
       ON (A.X = B.X AND B.Y = 'something')

现在即使表 B 中不存在匹配的行,也会返回表 A 的行。


更新

连接条件

arrival.DepartureLocation = aircraft.Asset 

错了。您应该将DepartureLocation 与另一个Location 进行比较,而不是与Asset 进行比较

【讨论】:

  • 你是对的。我不得不在屏幕之间手动复制。实际上是arrival.DepartureLocation=aircraft.Home。
猜你喜欢
  • 2014-09-09
  • 2023-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-18
  • 1970-01-01
相关资源
最近更新 更多