Использование значений оператора CASE в выражении THEN

Я пытаюсь использовать заявление случая, но продолжаю получать ошибки. Вот утверждение:

select TABLE1.acct,
        CASE
          WHEN TABLE1.acct_id in (select acct_id 
                                    from TABLE2 
                                group by acct_id 
                                  having count(*) = 1 ) THEN
             (select name 
                from TABLE3 
               where TABLE1.acct_id = TABLE3.acct_id)
          ELSE 'All Others'
        END as Name
   from TABLE1

Когда я заменяю TABLE1.acct_id в выражении THEN на буквальное значение, запрос работает. Когда я пытаюсь использовать TABLE1.acct_id из части запроса WHEN, я получаю сообщение об ошибке, говорящее о том, что результатом является более чем одна строка. Кажется, что выражение THEN игнорирует единственное значение, которое использовал оператор WHEN. Не знаю, может быть, это даже не правильное использование оператора CASE.

Я пытаюсь увидеть имена для учетных записей, которые имеют одну запись в TABLE2.

Любые идеи будут оценены, я немного новичок в SQL.

5 ответов

Решение

Во-первых, вам не хватает запятой после TABLE1.acct. Во-вторых, вы использовали псевдоним TABLE1 как acctтак что вы должны использовать это.

Select acct.acct
    , Case 
        When acct.acct_id in ( Select acct_id 
                                From TABLE2 
                                Group By acct_id 
                                Having Count(*) = 1 ) 
            Then ( Select name 
                    From TABLE3 
                    Where acct.acct_id = TABLE3.acct_id
                    Fetch First 1 Rows Only) 
        Else 'All Others' 
        End as Name 
From TABLE1 As acct

Как уже говорили другие, вы должны изменить свое предложение THEN, чтобы гарантировать, что возвращается только одно значение. Вы можете сделать это, добавив Fetch First 1 Rows Only в свой подзапрос.

Then ( Select name 
       From TABLE3 
       Where acct.acct_id = TABLE3.acct_id
       Fetch First 1 Rows Only) 

Fetch не принимается в операторе CASE - "Ключевое слово FETCH не ожидается. Действительные токены:) UNION EXCEPT. "

Должно быть получено более одного значения.

Вы можете заменить тело с...

(select count(name) from TABLE3 where TABLE1.acct_id = TABLE3.acct_id)

... чтобы сузить, какие строки возвращают кратные.

Это может быть тот случай, когда вам просто нужно DISTINCT или TOP 1 чтобы уменьшить ваш набор результатов.

Удачи!

select name from TABLE3 where TABLE1.acct_id = TABLE3.acct_id

выдаст вам все имена в Таблице 3, у которых есть сопровождающая строка в Таблице 1. Строка, выбранная из Таблицы 2 в предыдущей строке, в нее не входит.

Я думаю, что здесь происходит то, что ваш случай должен возвращать одно значение, потому что это будет значение для столбца "имя". Подзапрос (select acct_id from TABLE2 group by acct_id having count(*) = 1 ) все в порядке, потому что он вернет только одно значение. (select name from TABLE3 where TABLE1.acct_id= TABLE3.acct_id) может вернуть несколько значений в зависимости от ваших данных. Проблема в том, что вы пытаетесь засунуть несколько значений в одно поле для одной строки.

Следующее, что нужно сделать, это выяснить, какие данные приводят к возвращению нескольких строк (select name from TABLE3 where TABLE1.acct_id= TABLE3.acct_id)и посмотрите, сможете ли вы еще больше ограничить этот запрос, чтобы он возвращал только одну строку. Если нужно, вы можете даже попробовать что-то вроде ...AND ROWNUM = 1 (для Oracle - другие БД имеют аналогичные способы ограничения количества возвращаемых строк).

Другие вопросы по тегам