相关子查询中的CASE表达式

时间:2014-11-05 11:01:04

标签: sql-server subquery case business-objects

以下代码是我编写的查询的简化和匿名部分。目的是使用相关子查询在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的使用等。

感谢。

1 个答案:

答案 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表达不正确仍未解决。