【发布时间】:2014-11-05 11:01:04
【问题描述】:
以下代码是我编写的查询的简化和匿名部分。目的是使用相关子查询在 tblB 中查找记录,使用 tblA.ID 和 tblB.ID 链接,并且在匹配的地方,只需为 [Entry] 显示“Yes”,否则显示“No ID Recorded”。使用 CASE 表达式,我试图实现转换为的结果;
当有记录匹配 THEN 'Yes'
当没有记录匹配时(即对于 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 而不是我希望的字符串“No ID Recorded”。但是,它确实在匹配的地方正确显示“是”。我尝试将 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 的使用。
谢谢。
【问题讨论】:
标签: sql-server subquery case business-objects