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 NULL
LEFT 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)