次のクエリを検討してください。
SELECT dgc.Id, h.[identity], h.associate_number, h.pos_start, h.pos_stop,
ISNULL((
SELECT DATEADD(DAY, -1, ih.pos_start)
FROM #hr_data_dgc ih
WHERE ih.associate_number = h.associate_number AND
ih.Id = (dgc.Id - 1)
), h.pos_stop) AS new_pos_stop
FROM #hr_data h
JOIN #hr_data_dgc dgc ON dgc.[identity] = h.[identity]
フィールドISNULL
のサブクエリからの結果に対して利用されているステートメントに特に注意してください。new_pos_stop
サブクエリが を返す場合、これは期待どおりに機能しますNULL
。
ここで、そのクエリを少し変更すると、次のようになります。
SELECT dgc.Id, h.[identity], h.associate_number, h.pos_start, h.pos_stop,
(
SELECT ISNULL(DATEADD(DAY, -1, ih.pos_start), h.pos_stop)
FROM #hr_data_dgc ih
WHERE ih.associate_number = h.associate_number AND
ih.Id = (dgc.Id - 1)
) AS new_pos_stop
FROM #hr_data h
JOIN #hr_data_dgc dgc ON dgc.[identity] = h.[identity]
サブクエリで値を取得するのではなく、NULL
forを返します。new_pos_stop
h.pos_stop
これが私が理解していないことです。h
andの値ih
(つまり、選択されている現在の行) をWHERE
句では利用できますが、SELECT
リストでは利用できませんか?
要するに、リストにはレキシカルスコープがないように見えます (その用語を大まかに使用しています)、私はそれで正しいですか? SELECT
言い換えれば、SELECT
リストは直接節の要素のみを活用できます。 FROM