以下代码是我编写的查询的简化和匿名部分。目的是使用相关子查询在tblB中查找记录,使用tblA.ID和tblB.ID链接,如果匹配,只需为[Entry]显示“Yes”,否则显示“No ID Recorded”。使用CASE表达式,我试图实现转换为;
的结果当记录匹配那么'是'
当没有记录匹配时(即对于tblA.ID,没有 tblB.ID)然后'没有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中执行查询时已经包含了business-objects标记,它排除了CTE的使用等。
感谢。
答案 0 :(得分:0)
我想通过使用完全不同的方法,可以使用以下方法实现:
SELECT
CASE
WHEN tblA.ID IN
(
SELECT
tblB.ID
FROM
tblB
WHERE
tblB.EndDate IS NULL
)
THEN 'Yes'
ELSE 'No ID Recorded'
END [Entry]
似乎工作,虽然为什么原始方法和CASE表达不正确仍未解决。