0

不可解なクエリ結果または不足...

2 番目のテーブルに既に存在する可能性のあるレコードをセットから除外して、レコード セットを返そうとしています。

SELECT        trID
FROM            ttTrct
WHERE        (trID NOT IN
             (SELECT rteVehID
              FROM  rtHist
              WHERE  (rteSchedDT = '11/19/2012 12:00:00 AM')))


ORDER BY tractorID

実際のwhere句は...

WHERE  (rteSchedDT = CAST(@targetDate AS DATETIME))

ただし、問題を回避するために静的な日付値も試しています。

rtHist に 3 つのレコードが存在する

 rteVehID    rteSchedDT
 NULL        11/12/2012 12:00:00 AM
 NULL        11/19/2012 12:00:00 AM
 1645        11/19/2012 12:00:00 AM

ttTrct に 5 つのレコードが存在する

 trID
 1234
 4567
 9874
 1645
 2442

結果セットには 1645 ではなく 4 つのレコードが含まれると予想していますが、NULL しか取得できません。また、rtHist テーブルの 3 番目のレコードも 1645 ではなく NULL だった場合、結果も得られません。もちろん、静的な日付は最終的に変数になります。

私が欠けているものについてのアイデアはありますか? 前もって感謝します。SSEE 2008 R2

4

3 に答える 3

1

使用できますNOT EXISTS

SELECT trID
FROM  ttTrct t
WHERE not exists (SELECT rteVehID
                   FROM  rtHist h
                   WHERE  rteSchedDT = '11/19/2012 12:00:00 AM'
                     and t.trID = h.rteVehID)
ORDER BY tractorID

デモで SQL Fiddle を参照してください

NOT INEXISTSとの違いに関する素晴らしい記事は次のLEFT JOINとおりです。

NOT IN vs. NOT EXISTS vs. LEFT JOIN / IS NULL: SQL Server

于 2013-01-03T18:49:34.880 に答える
0

原因は、NOT IN句が一連のANDステートメントに展開されることです。NULL任意の値をisNULLおよびAND NULLalwaysと比較するとNULL、 where 句は never になるためTRUEです。いつもNULLです。

試す:

SELECT   trID
FROM     ttTrct
WHERE    (trID NOT IN
         (SELECT rteVehID
         FROM  rtHist
         WHERE  (rteSchedDT = '11/19/2012 12:00:00 AM')
             AND rteVehID IS NOT NULL))

または、結合を使用することもできます。これは、同一または優れた実行計画を持つ可能性が非常に高くなります。

SELECT     t.trID
FROM       ttTrct t
INNER JOIN rtHist r
        ON t.trID = r.rtHist
WHERE      r.rteSchedDT = '11/19/2012 12:00:00 AM'

ソース

于 2013-01-03T19:03:04.237 に答える
0

サブクエリにヌルが入り込んで混乱するという同様の状況がありました。試す

...
WHERE  (rteSchedDT = '11/19/2012 12:00:00 AM'
        and rteScheDT is not null)))
...

これはここでの問題ではないと思いますが、試してみる価値はあります。

また、なぜ

(rteSchedDT = CAST(@targetDate AS DATETIME))

? @targetDate を日時変数にするだけです。

于 2013-01-03T18:54:23.680 に答える