Следующий код является упрощенным и анонимным разделом запрошенного мной запроса. Цель состоит в том, чтобы найти запись в tblB с помощью коррелированного подзапроса, связанного с использованием tblA.ID и tblB.ID, и там, где есть совпадение, просто отобразите «Да» для [Ввод], иначе отобразите «Нет идентификатора». Используя выражение CASE, я пытаюсь достичь результата, который переводится;Выражение CASE в коррелированном подзапросе
, когда есть соответствующая запись THEN 'Да'
Когда нет соответствующей записи (т.е. для tblA.ID, нет tblB.ID) THEN 'Нет ID не Записанный'
Я использовал функцию set ROW_NUMBER() для учета того факта, что в подзапросе может быть более одной соответствующей записи, и в этом случае произойдет ошибка с возвратом значения 1.
Код:
SELECT
tblA.ID,
tblA.StartDate,
tblA.EndDate,
--
--Correlated sub query
--
(
SELECT
[Entry]
FROM
(
SELECT
CASE
WHEN tblB.ID IS NULL THEN 'No ID Recorded'
ELSE 'Yes'
END [Entry],
ROW_NUMBER() OVER(ORDER BY tblB.StartDate DESC, tblB.ID DESC) [RowNo]
FROM
tblB
WHERE
tblA.ID = tblB.ID
AND
tblB.EndDate IS NULL
) sub
WHERE
[RowNo] = 1
) [Entry]
FROM
tblA
WHERE
/* Additional criteria */
Когда я запускаю это, однако, отображаются в столбце NULL, а не строка «Нет ID записи», который я надеялся. Однако он правильно отображает «Да», где есть совпадение. Я попытался применить выражение CASE к родительскому подзапросу, то есть:
(
SELECT
CASE
WHEN [Entry] IS NULL THEN 'No ID Recorded'
ELSE 'Yes'
END [Entry]
FROM
(
SELECT
tblB.ID [Entry],
ROW_NUMBER() OVER(ORDER BY tblB.StartDate DESC, tblB.ID DESC) [RowNo]
FROM
tblB
WHERE
tblA.ID = tblB.ID
AND
tblB.EndDate IS NULL
) sub
WHERE
[RowNo] = 1
) [Entry]
По-прежнему возвращаются NULL. Когда я выполняю запрос sub как запрос самостоятельно, i.e:
SELECT
CASE
WHEN tblB.ID IS NULL THEN 'No ID Recorded'
ELSE 'Yes'
END [Entry]
FROM
tblA
LEFT OUTER JOIN tblB -- Left join to test the CASE expression
ON tblA.ID = tblB.ID
Затем он работает нормально. Это явно не имеет функции ROW_NUMBER(), но это не требуется для этого теста.
Я включил тег бизнес-объектов, поскольку я выполняю запрос в Web Intelligence, который, кроме прочего, исключает использование CTE.
Спасибо.