0

次のクエリを検討してください。

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]

サブクエリで値を取得するのではなく、NULLforを返します。new_pos_stoph.pos_stop

これが私が理解していないことです。handの値ih(つまり、選択されている現在の行) をWHERE句では利用できますが、SELECTリストでは利用できませんか?

要するに、リストにはレキシカルスコープがないように見えます (その用語を大まかに使用しています)、私はそれで正しいですか? SELECT言い換えれば、SELECTリストは直接節の要素のみを活用できます。 FROM

4

2 に答える 2