0

SQL クエリを実行すると特定の結果が得られる理由がわかりません。これはクエリです:

SELECT A.flag, B.type, B.aID
FROM A
LEFT JOIN B ON B.aID = A.aID
WHERE A.startDate = '2013-01-07'
    AND (A.flag = 1 OR B.type IS NOT NULL)

aID はテーブル A の主キーです。

これは私が得る結果です:

flag type aID
---- ---- ----
0    NULL NULL

結果が出ないことを期待していたでしょう。A.flag が 1 ではなく、B.type が null であるため、混乱しています。これは、私の WHERE 句に反しているようです。B.aID が結果で null であるため、テーブル B のこの行に一致するものがないことに注意してください。A.flag = 1両方ではなく1 つだけを使用してクエリを実行すると、1 つB.type IS NOT NULLの結果ではなく、結果が返されません。

奇妙なことに、SELECT ステートメントの B.type を ISNULL(B.type, 'X') に置き換えると、結果が返されません。AND B.type IS NOT NULLLEFT JOINに追加すると、同じことが起こります。

この結果が得られるのはなぜですか?

編集:サンプルデータ

以下は、2 つの異なる開始日を使用してテーブル A から行を取得するクエリです。

SELECT * FROM A
WHERE A.startDate IN ('2013-01-07', '2012-11-23')

次の結果が得られます (わかりやすくするために 6 列を省略しています)。

aID     cID  sID  psID startDate               flag 
------- ---- ---- ---- ----------------------- -----
23844   75   72   86   2013-01-07 00:00:00     0    
23940   75   72   86   2012-11-23 00:00:00     1    
21061   76   73   87   2012-11-23 00:00:00     0    
21293   76   74   88   2012-11-23 00:00:00     0    
21477   77   75   89   2012-11-23 00:00:00     0    
21711   78   76   90   2012-11-23 00:00:00     0    
21944   79   77   91   2012-11-23 00:00:00     0    
22176   80   78   92   2012-11-23 00:00:00     0    
22410   81   79   93   2012-11-23 00:00:00     0    
22643   82   80   94   2012-11-23 00:00:00     0    
23344   83   81   95   2012-11-23 00:00:00     0    
22876   84   82   96   2012-11-23 00:00:00     0    
23639   85   83   97   2012-11-23 00:00:00     0    
23109   89   84   98   2012-11-23 00:00:00     0    

(14 row(s) affected)

2013 年 1 月 7 日に見つかった aID を使用すると、この次のクエリから、その開始日に対応するエントリがテーブル B にないことがわかります。

SELECT * FROM B
WHERE B.aID = 23844

これは結果を返しません。

2012 年 11 月 23 日に見つかった aID を使用すると、これらの 1 つを除くすべてがテーブル B に対応するエントリを持っていることがわかります。

SELECT * FROM B
WHERE B.aID IN (23940,
    21061,
    21293,
    21477,
    21711,
    21944,
    22176,
    22410,
    22643,
    23344,
    22876,
    23639,
    23109)

結果:

bID   aID    type  duration iMinutes
----- ------ ----- -------- ---------
5836  21061  M     0        0
5893  21293  M     0        0
5916  21477  M     0        0
5975  21711  M     0        0
6033  21944  M     0        0
6092  22176  M     0        0
6150  22410  M     0        0
6208  22643  M     0        0
6266  22876  M     0        0
6530  23109  M     0        0
6382  23344  M     0        0
6478  23639  M     0        0

(12 row(s) affected)
4

2 に答える 2

0

このデータベース(2008)にサービスパックがインストールされていないため、これが発生していることがわかりました。SP1がインストールされている他のデータベースには、この問題はありません。

于 2013-01-08T21:05:04.447 に答える
-1

これは、LEFT (OUTER) JOIN を実行しているためです。おそらく、INNER JOIN はあなたが念頭に置いていたものですか?

于 2013-01-08T09:01:08.847 に答える