2014-11-05 4 views
0

Следующий код является упрощенным и анонимным разделом запрошенного мной запроса. Цель состоит в том, чтобы найти запись в tblB с помощью коррелированного подзапроса, связанного с использованием tblA.ID и tblB.ID, и там, где есть совпадение, просто отобразите «Да» для [Ввод], иначе отобразите «Нет идентификатора». Используя выражение 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 */ 

Когда я запускаю это, однако, отображаются в столбце NULL, а не строка «Нет ID записи», который я надеялся. Однако он правильно отображает «Да», где есть совпадение. Я попытался применить выражение 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. Когда я выполняю запрос sub как запрос самостоятельно, i.e:

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] 

Кажется работать, хотя, почему исходное выражение подход и случай не был правильным остается нерешенной.

Смежные вопросы