3

左結合を使用し、左結合の結果として Next_Home_Stop という派生フィールドに null 値を持つ、qry_sub_Loop という 1 つのクエリがあります。

qry_sub_Loop に基づく他のクエリで問題が発生しています。

私が試した問題を特定するためのテストとして:

  1. select * from qry_sub_Loop where Next_Home_Stop is null
  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 が null でない行のみを返します。


表:到着
- MissionID (テキスト)
-ArrivalTime(ダブル)
- DepartureTime (ダブル)
- DepartureLocation (テキスト)
- 到着場所 (テキスト)
- アセット (テキスト)

表:航空機
- アセット (テキスト)、
- ホーム (テキスト)

クエリ:

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_Stopは実際にはであるためmin(arrival_1.ArrivalTime)、Null値と非Null値の両方を含めることはできません。

Min(ArrivalTime)次の2つの状況でのみNullを返すことができます。

  1. すべてのArrivalTime値はNullです。
  2. Min()評価する行があります。

ArrivalTimeヌル以外の値が含まれている場合Min()、ヌル値を無視し、ヌル以外の最小値を提供します。

于 2012-12-28T19:15:29.400 に答える
1

結合された行の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 );
于 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 

間違っている。を と比較するのではなく、DepartureLocation別の と比較する必要があります。LocationAsset

于 2012-12-28T22:36:01.383 に答える