Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Подзапрос и ORA-01427  [new]
maverick2104
Member

Откуда:
Сообщений: 247
Добрый день , помогите пожалуйста , пол дня уже убил на выявление ошибки .

Вот запрос который должен вычислить сотрудников которые сменили место работы внутри компаний в определеный день .
Запрос в процедуре , процедура в джобе . Эти данные пишутся в файлик а файлик посылается нужным людям , не важно.

Последнее время жалуются что файл пустой , хотя переводы рабочих были.
Пытаюсь запустить запрос за вчерашний день и получаю ora-01427 .
+ Запрос
select *
                from (select p.tabn3,
                             initcap(p.name3) name3,
                             initcap(p.family3) family3,
                             o.name_podr23 name_podr23_actual,
                             d.naim_dolj9 naim_dolj9_actual,
               (case
                 when (select (select pd.Name_Podr23
                                 from podrs pd
                                where pd.code23 = pt.podr_code23)
                         from paths pt
                        where pt.person_tabn3 = p.tabn3
                          and pt.dat_nazn16 =
                              (select max(pt1.dat_nazn16)
                                 from paths pt1
                                where pt1.person_tabn3 = pt.person_tabn3
                                  and pt1.dat_nazn16 < x.dat_nazn161)) =
                      'Echipa mobila' then
                  (select (select p.Name_Podr23
                             from PODRS P
                            where p.name_podr23 <> 'Echipa mobila' and rownum = 1
                            start with p.code23 = pt.podr_code23
                           connect by prior p.podr_code23 = p.code23)
                     from paths pt
                    where pt.person_tabn3 = p.tabn3
                      and pt.dat_nazn16 =
                          (select max(pt1.dat_nazn16)
                             from paths pt1
                            where pt1.person_tabn3 = pt.person_tabn3
                              and pt1.dat_nazn16 < x.dat_nazn161))
                 else
                  (select (select pd.Name_Podr23
                             from podrs pd
                            where pd.code23 = pt.podr_code23)
                     from paths pt
                    where pt.person_tabn3 = p.tabn3
                      and pt.dat_nazn16 =
                          (select max(pt1.dat_nazn16)
                             from paths pt1
                            where pt1.person_tabn3 = pt.person_tabn3
                              and pt1.dat_nazn16 < x.dat_nazn161))
               end) Name_Podr_prec,
                             (select (select dj.naim_dolj9
                                        from Doljnosts dj
                                       where dj.code9 = pt.doljnost_code9)
                                from paths pt
                               where pt.person_tabn3 = p.tabn3
                                 and pt.dat_nazn16 =
                                     (select max(pt1.dat_nazn16)
                                        from paths pt1
                                       where pt1.person_tabn3 = pt.person_tabn3
                                         and pt1.dat_nazn16 < x.dat_nazn161)) Dolj_prec,
                             ' ' TELEFON
                        from persons p, shtats s, podrs o, doljnosts d,
                             (select max(t.dat_nazn16) as dat_nazn161, t.person_tabn3
                                from paths t
                               where t.dat_nazn16 =  trunc(sysdate) -1
                               group by t.person_tabn3
                              UNION
                              select min(t.dat_nazn16) as dat_nazn161, t.person_tabn3
                                from paths t
                               where t.dat_nazn16 = trunc(sysdate) -1
                               group by t.person_tabn3) x
                       where p.dat_uvolnen3 is null
                         and p.tabn3 = s.person_tabn3
                         and s.podr_code23 = o.code23
                         and s.doljnost_code9 = d.code9
                         and p.tabn3 = x.person_tabn3)
               where (name_podr23_actual <> Name_Podr_prec or naim_dolj9_actual <> Dolj_prec) and -- scos la 040118
                     Name_Podr_prec is not null and Dolj_prec is not null
               order by 1

Все это писал не я , но разобраться поручено мне . Буду рад за любые наводки .

Спасибо .
4 окт 18, 11:04    [21694909]     Ответить | Цитировать Сообщить модератору
 Re: Подзапрос и ORA-01427  [new]
-2-
Member

Откуда:
Сообщений: 13826
maverick2104
пол_дня уже убил на выявление ошибки.
Выявил.
4 окт 18, 11:10    [21694921]     Ответить | Цитировать Сообщить модератору
 Re: Подзапрос и ORA-01427  [new]
dmdmdm
Member

Откуда: Нижний Новгород
Сообщений: 1086
maverick2104
Буду рад за любые наводки .


На водку можно заработать, прочитав текст ошибки: подзапрос возвращает более одной строки.

SQL> select (select 1 from dual) from dual;

(SELECT1FROMDUAL)
-----------------
                1
SQL> select (select 1 from dual union all select 2 from dual) from dual;

select (select 1 from dual union all select 2 from dual) from dual

ORA-01427: подзапрос одиночной строки возвращает более одной строки
4 окт 18, 11:12    [21694925]     Ответить | Цитировать Сообщить модератору
 Re: Подзапрос и ORA-01427  [new]
maverick2104
Member

Откуда:
Сообщений: 247
dmdmdm,

Правильно , но какой подзапрос ? Как починить/излечить запрос ?
4 окт 18, 11:13    [21694929]     Ответить | Цитировать Сообщить модератору
 Re: Подзапрос и ORA-01427  [new]
dmdmdm
Member

Откуда: Нижний Новгород
Сообщений: 1086
maverick2104
Правильно , но какой подзапрос ?


Надо найти.

maverick2104
Как починить/излечить запрос ?


Смотря что надо по логике работы. Исправить данные, если в этом месте всегда должна быть 1 строка в результате запроса, либо исправить запрос. Например, использовать агрегирующие функции, или вместо = написать in (...).
4 окт 18, 11:16    [21694932]     Ответить | Цитировать Сообщить модератору
 Re: Подзапрос и ORA-01427  [new]
dmdmdm
Member

Откуда: Нижний Новгород
Сообщений: 1086
Судя по "and rownum = 1", уже были попытки исправить, и попытки кривые.
4 окт 18, 11:17    [21694933]     Ответить | Цитировать Сообщить модератору
 Re: Подзапрос и ORA-01427  [new]
maverick2104
Member

Откуда:
Сообщений: 247
dmdmdm
Смотря что надо по логике работы. Исправить данные, если в этом месте всегда должна быть 1 строка в результате запроса, либо исправить запрос. Например, использовать агрегирующие функции, или вместо = написать in (...).


В результате не должна быть одна 1 строка .

Пробовал вместо = , in , такая же беда .
4 окт 18, 11:18    [21694936]     Ответить | Цитировать Сообщить модератору
 Re: Подзапрос и ORA-01427  [new]
dmdmdm
Member

Откуда: Нижний Новгород
Сообщений: 1086
maverick2104
В результате не должна быть одна 1 строка .

Пробовал


В in (...) может быть не одна строка.

В select (select) - должна быть одна.
4 окт 18, 11:23    [21694943]     Ответить | Цитировать Сообщить модератору
 Re: Подзапрос и ORA-01427  [new]
env
Member

Откуда: Россия, Москва
Сообщений: 5847
maverick2104,

сделайте меня это развидеть...

в каждый select (select ) ставишь свой rownum =1 и по одному убираешь - тупо, но гарантированно найдёшь

более правильно - проанализировать, что должен возвращать запрос и переписать его без подобных конструкций
4 окт 18, 11:35    [21694973]     Ответить | Цитировать Сообщить модератору
 Re: Подзапрос и ORA-01427  [new]
maverick2104
Member

Откуда:
Сообщений: 247
env
maverick2104,

сделайте меня это развидеть...

в каждый select (select ) ставишь свой rownum =1 и по одному убираешь - тупо, но гарантированно найдёшь

более правильно - проанализировать, что должен возвращать запрос и переписать его без подобных конструкций


Код ужасен , знаю .

Спасибо вы мне помогли .
4 окт 18, 11:43    [21694983]     Ответить | Цитировать Сообщить модератору
 Re: Подзапрос и ORA-01427  [new]
MaximaXXL
Member

Откуда: Киев
Сообщений: 594
maverick2104,
Увиденного не развидеть

Может проще начать переписывать? А не просто добавлять костыли?

Например:
               (case
                 when (select (select pd.Name_Podr23
                                 from podrs pd
                                where pd.code23 = pt.podr_code23)
                         from paths pt
                        where pt.person_tabn3 = p.tabn3
                          and pt.dat_nazn16 =
                              (select max(pt1.dat_nazn16)
                                 from paths pt1
                                where pt1.person_tabn3 = pt.person_tabn3
                                  and pt1.dat_nazn16 < x.dat_nazn161)) =
                      'Echipa mobila' then
                  (select (select p.Name_Podr23
                             from PODRS P
                            where p.name_podr23 <> 'Echipa mobila' and rownum = 1
                            start with p.code23 = pt.podr_code23
                           connect by prior p.podr_code23 = p.code23)
                     from paths pt
                    where pt.person_tabn3 = p.tabn3
                      and pt.dat_nazn16 =
                          (select max(pt1.dat_nazn16)
                             from paths pt1
                            where pt1.person_tabn3 = pt.person_tabn3
                              and pt1.dat_nazn16 < x.dat_nazn161))
                 else
                  (select (select pd.Name_Podr23
                             from podrs pd
                            where pd.code23 = pt.podr_code23)
                     from paths pt
                    where pt.person_tabn3 = p.tabn3
                      and pt.dat_nazn16 =
                          (select max(pt1.dat_nazn16)
                             from paths pt1
                            where pt1.person_tabn3 = pt.person_tabn3
                              and pt1.dat_nazn16 < x.dat_nazn161))
               end) Name_Podr_prec,


сокращенно запись выглядит так
case Name_Podr23 = 'Echipa mobila'
then вывести ближайший не 'Echipa mobila'
else вывести перый

так замени єтот блок сразу на :
 (select (select p.Name_Podr23
                             from PODRS P
                            where p.name_podr23 <> 'Echipa mobila' and rownum = 1
                            start with p.code23 = pt.podr_code23
                           connect by prior p.podr_code23 = p.code23)
                     from paths pt
                    where pt.person_tabn3 = p.tabn3
                      and pt.dat_nazn16 =
                          (select max(pt1.dat_nazn16)
                             from paths pt1
                            where pt1.person_tabn3 = pt.person_tabn3
                              and pt1.dat_nazn16 < x.dat_nazn161))

т.е. он будет сразу искать первій ближайший не 'Echipa mobila' ,т.е. будет первая строка не 'Echipa mobila' он выведет ее иначе пойдет дальше искать
Хоть строк в говнокоде будет меньше
4 окт 18, 12:08    [21695026]     Ответить | Цитировать Сообщить модератору
 Re: Подзапрос и ORA-01427  [new]
MaximaXXL
Member

Откуда: Киев
Сообщений: 594
maverick2104,

У Вас надо искать человека у которого в 1 день есть более 1 записи в таблице paths:

селект для поиска выглядит так

select pt.person_tabn3, pt.dat_nazn16, count(*) cnt
from paths pt
group by pt.person_tabn3, pt.dat_nazn16
having count(*) > 1


Или, что моло вероятно, на 1 код 2 должности

select dj.code9, count(*) cnt
from Doljnosts dj
group by dj.code9
having  count(*) > 1
4 окт 18, 12:33    [21695066]     Ответить | Цитировать Сообщить модератору
 Re: Подзапрос и ORA-01427  [new]
maverick2104
Member

Откуда:
Сообщений: 247
MaximaXXL
maverick2104,

У Вас надо искать человека у которого в 1 день есть более 1 записи в таблице paths:

селект для поиска выглядит так

select pt.person_tabn3, pt.dat_nazn16, count(*) cnt
from paths pt
group by pt.person_tabn3, pt.dat_nazn16
having count(*) > 1



Я первом делом это и проверил , но на вчерашний день 03/10/2018 нет одинаковых записей на 1 человека .
4 окт 18, 12:47    [21695088]     Ответить | Цитировать Сообщить модератору
 Re: Подзапрос и ORA-01427  [new]
MaximaXXL
Member

Откуда: Киев
Сообщений: 594
maverick2104,

А причем тут вчерашний?

(select max(pt1.dat_nazn16)
                                        from paths pt1
                                       where pt1.person_tabn3 = pt.person_tabn3
                                         and pt1.dat_nazn16 < x.dat_nazn161)
4 окт 18, 13:11    [21695120]     Ответить | Цитировать Сообщить модератору
 Re: Подзапрос и ORA-01427  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 1319
MaximaXXL
maverick2104,

А причем тут вчерашний?

(select max(pt1.dat_nazn16)
                                        from paths pt1
                                       where pt1.person_tabn3 = pt.person_tabn3
                                         and pt1.dat_nazn16 < x.dat_nazn161)


так ж max по любому вернет одну запись

.....
stax
4 окт 18, 14:45    [21695268]     Ответить | Цитировать Сообщить модератору
 Re: Подзапрос и ORA-01427  [new]
MaximaXXL
Member

Откуда: Киев
Сообщений: 594
Stax
MaximaXXL
maverick2104,

А причем тут вчерашний?

(select max(pt1.dat_nazn16)
                                        from paths pt1
                                       where pt1.person_tabn3 = pt.person_tabn3
                                         and pt1.dat_nazn16 < x.dat_nazn161)


так ж max по любому вернет одну запись

.....
stax


Да, max вернет 1 запись и не обязательно ВЧЕРА. А посему надо искать дубли глубже чем вчера

А по хорошему - надо переписівать
4 окт 18, 15:05    [21695313]     Ответить | Цитировать Сообщить модератору
 Re: Подзапрос и ORA-01427  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 1319
MaximaXXL
Да, max вернет 1 запись и не обязательно ВЧЕРА. А посему надо искать дубли глубже чем вчера


я не о логике, я о ora-01427

....
stax
4 окт 18, 15:33    [21695379]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить