【问题标题】:CASE expression in a correlated sub query相关子查询中的 CASE 表达式
【发布时间】: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


    【解决方案1】:

    我想通过使用完全不同的方法可以实现:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-06
      • 1970-01-01
      • 1970-01-01
      • 2015-09-10
      • 1970-01-01
      相关资源
      最近更新 更多