powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Подзапрос и ORA-01427
17 сообщений из 17, страница 1 из 1
Подзапрос и ORA-01427
    #39712857
maverick2104
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день , помогите пожалуйста , пол дня уже убил на выявление ошибки .

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

Последнее время жалуются что файл пустой , хотя переводы рабочих были.
Пытаюсь запустить запрос за вчерашний день и получаю ora-01427 .
Запрос
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
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


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

Спасибо .
...
Рейтинг: 0 / 0
Подзапрос и ORA-01427
    #39712863
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maverick2104 пол_дня уже убил на выявление ошибки.Выявил.
...
Рейтинг: 0 / 0
Подзапрос и ORA-01427
    #39712867
dmdmdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maverick2104Буду рад за любые наводки .

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

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
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: подзапрос одиночной строки возвращает более одной строки
...
Рейтинг: 0 / 0
Подзапрос и ORA-01427
    #39712869
maverick2104
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dmdmdm,

Правильно , но какой подзапрос ? Как починить/излечить запрос ?
...
Рейтинг: 0 / 0
Подзапрос и ORA-01427
    #39712870
dmdmdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maverick2104Правильно , но какой подзапрос ?


Надо найти.

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

Смотря что надо по логике работы. Исправить данные, если в этом месте всегда должна быть 1 строка в результате запроса, либо исправить запрос. Например, использовать агрегирующие функции, или вместо = написать in (...).
...
Рейтинг: 0 / 0
Подзапрос и ORA-01427
    #39712871
dmdmdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Судя по "and rownum = 1", уже были попытки исправить, и попытки кривые.
...
Рейтинг: 0 / 0
Подзапрос и ORA-01427
    #39712872
maverick2104
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dmdmdmСмотря что надо по логике работы. Исправить данные, если в этом месте всегда должна быть 1 строка в результате запроса, либо исправить запрос. Например, использовать агрегирующие функции, или вместо = написать in (...).

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

Пробовал вместо = , in , такая же беда .
...
Рейтинг: 0 / 0
Подзапрос и ORA-01427
    #39712876
dmdmdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maverick2104В результате не должна быть одна 1 строка .

Пробовал

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

В select (select) - должна быть одна.
...
Рейтинг: 0 / 0
Подзапрос и ORA-01427
    #39712888
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maverick2104,

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

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

более правильно - проанализировать, что должен возвращать запрос и переписать его без подобных конструкций
...
Рейтинг: 0 / 0
Подзапрос и ORA-01427
    #39712892
maverick2104
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
envmaverick2104,

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

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

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

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

Спасибо вы мне помогли .
...
Рейтинг: 0 / 0
Подзапрос и ORA-01427
    #39712910
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maverick2104,
Увиденного не развидеть

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

Например:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
               (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 вывести перый

так замени єтот блок сразу на :
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
 (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' он выведет ее иначе пойдет дальше искать
Хоть строк в говнокоде будет меньше
...
Рейтинг: 0 / 0
Подзапрос и ORA-01427
    #39712926
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maverick2104,

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

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

Код: plsql
1.
2.
3.
4.
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 должности

Код: plsql
1.
2.
3.
4.
select dj.code9, count(*) cnt
from Doljnosts dj
group by dj.code9
having  count(*) > 1
...
Рейтинг: 0 / 0
Подзапрос и ORA-01427
    #39712945
maverick2104
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaximaXXLmaverick2104,

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

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

Код: plsql
1.
2.
3.
4.
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 человека .
...
Рейтинг: 0 / 0
Подзапрос и ORA-01427
    #39712961
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maverick2104,

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

Код: plsql
1.
2.
3.
4.
(select max(pt1.dat_nazn16)
                                        from paths pt1
                                       where pt1.person_tabn3 = pt.person_tabn3
                                         and pt1.dat_nazn16 < x.dat_nazn161)
...
Рейтинг: 0 / 0
Подзапрос и ORA-01427
    #39713032
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaximaXXLmaverick2104,

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

Код: plsql
1.
2.
3.
4.
(select max(pt1.dat_nazn16)
                                        from paths pt1
                                       where pt1.person_tabn3 = pt.person_tabn3
                                         and pt1.dat_nazn16 < x.dat_nazn161)



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

.....
stax
...
Рейтинг: 0 / 0
Подзапрос и ORA-01427
    #39713045
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
StaxMaximaXXLmaverick2104,

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

Код: plsql
1.
2.
3.
4.
(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 запись и не обязательно ВЧЕРА. А посему надо искать дубли глубже чем вчера

А по хорошему - надо переписівать
...
Рейтинг: 0 / 0
Подзапрос и ORA-01427
    #39713074
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaximaXXLДа, max вернет 1 запись и не обязательно ВЧЕРА. А посему надо искать дубли глубже чем вчера


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

....
stax
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Подзапрос и ORA-01427
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]