Использование Оператора выбора оценивает в ЗАТЕМ выражении

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

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 в тогдашнем выражении с литеральным значением, работах запроса. Когда я пытаюсь использовать TABLE1.acct_id от, КОГДА часть запроса, я получаю ошибку при высказывании, что результатом является больше чем одна строка. Кажется, что тогдашнее выражение игнорирует единственное значение, что, КОГДА оператор использовал. Никакая идея, возможно, это даже не допустимое использование Оператора выбора.

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

Любые идеи ценились бы, я довольно новый в SQL.

1
задан YeeHaw 29 July 2010 в 19:08
поделиться

4 ответа

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

1
ответ дан 2 September 2019 в 22:36
поделиться

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

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

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

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

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

Удачи!

0
ответ дан 2 September 2019 в 22:36
поделиться

Я думаю, что здесь происходит то, что ваш случай должен возвращать одно значение, потому что это будет значение для столбца "name". Подзапрос (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
ответ дан 2 September 2019 в 22:36
поделиться
select name from TABLE3 where TABLE1.acct_id = TABLE3.acct_id

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

0
ответ дан 2 September 2019 в 22:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: