Использование значений оператора CASE в выражении THEN - PullRequest
1 голос
/ 29 июля 2010

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

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 ]

1 голос
/ 22 февраля 2011
Then ( Select name 
       From TABLE3 
       Where acct.acct_id = TABLE3.acct_id
       Fetch First 1 Rows Only) 

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

1 голос
/ 29 июля 2010

Во-первых, вам не хватает запятой после 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 в свой подзапрос.

0 голосов
/ 29 июля 2010

Я думаю, что здесь происходит то, что ваш случай должен возвращать одно значение, потому что это будет значение для столбца «имя».Подзапрос (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 - другие БД имеют аналогичные способы ограничения возвращаемых строк).

0 голосов
/ 29 июля 2010

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

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

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

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

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

Удачи!

0 голосов
/ 29 июля 2010
select name from TABLE3 where TABLE1.acct_id = TABLE3.acct_id

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

...