3

我有一个名为 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 ... 
4

3 回答 3

3

检查Next_Home_Stop返回的值qry_sub_Loop

SELECT DISTINCT Next_Home_Stop FROM qry_sub_Loop;

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

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

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

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

于 2012-12-28T19:15:29.400 回答
1

因为连接行中的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 );
于 2012-12-28T18:25:42.620 回答
1

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

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 

是错的。您应该将 theDepartureLocation与 another进行比较Location,而不是与 anAsset

于 2012-12-28T22:36:01.383 回答