ORA-01427: однострочный подзапрос возвращает более одной строки в операторе CASE - PullRequest
3 голосов
/ 11 августа 2011

Я получаю ошибку ORA-01427 со следующим кодом:

update rpt_group a
set a.rpt_category_id = 
case
  when ((select c.control from grpmisc c
 where (c.grp = a.grp)) = '01') then '201'
  when ((select c.control from grpmisc c
 where (c.grp = a.grp)) = '02') then '202'
  when ((select c.control from grpmisc c
 where (c.grp = a.grp)) = '03') then '203'
 else '93'
   end
where rpt_category_id = '93';

Но когда я просто говорю, скажите

select c.control from grpmisc c, rpt_group a
 where c.grp = a.grp and a.grp = '01'

Возвращает без строк. Это то же самое для «02» и «03». Так почему я получаю ошибку «подзапрос возвращает более одной строки»?

спасибо ..

Ответы [ 2 ]

1 голос
/ 11 августа 2011

Вы запускаете этот тест ...
select c.control from grpmisc c, rpt_group a where c.grp = a.grp and a.grp = '01'

Но ваши подзапросы формируются на этом ...
select c.control from grpmisc c, rpt_group a where c.grp = a.grp

Если вы выполните последний из двух запросов, могу поспорить, вы получите много записей? Это означает, что либо вы пропустили and a.grp = '01' в своих подзапросах, либо вам нужно ограничить результаты только одной записью ...


Пара вариантов может быть ...

(select c.control from grpmisc c where c.grp = a.grp group by c.control)

(select c.control from grpmisc c where c.grp = a.grp and rownum < 2 order by <blah>)

0 голосов
/ 11 августа 2011

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

...
case
  when ((select c.control from grpmisc c
 where (c.grp = a.grp) and rownum < 2) = '01') then '201'
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...