以下代码是我编写的查询的简化和匿名化部分。其目的是在tblB中使用相关的子查询找到一条记录,使用tblA.ID和tblB.ID进行链接,如果匹配,只需在[Entry]中显示'Yes',否则显示'No ID Recorded'。使用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 */
当我运行然而,这列显示为空,而不是字符串“无号码录”,我曾经希望。但是,如果有匹配,它会正确显示“是”。我尝试将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。当我自己执行子查询作为查询时,即:
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在其他事情中的使用。
谢谢。