考虑以下查询:
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
子句中的内容。