2014-11-05 54 views
0

以下代码是我编写的查询的简化和匿名化部分。其目的是在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在其他事情中的使用。

谢谢。

回答

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表达式是不正确的仍然没有解决。