Использование значений оператора 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 - другие БД имеют аналогичные способы ограничения количества возвращаемых строк).