Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Подзапрос и ORA-01427 / 17 сообщений из 17, страница 1 из 1
04.10.2018, 11:04
    #39712857
maverick2104
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подзапрос и ORA-01427
Добрый день , помогите пожалуйста , пол дня уже убил на выявление ошибки .

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

Последнее время жалуются что файл пустой , хотя переводы рабочих были.
Пытаюсь запустить запрос за вчерашний день и получаю 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
04.10.2018, 11:10
    #39712863
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подзапрос и ORA-01427
maverick2104 пол_дня уже убил на выявление ошибки.Выявил.
...
Рейтинг: 0 / 0
04.10.2018, 11:12
    #39712867
dmdmdm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подзапрос и ORA-01427
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
04.10.2018, 11:13
    #39712869
maverick2104
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подзапрос и ORA-01427
dmdmdm,

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


Надо найти.

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

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

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

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

Пробовал

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

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

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

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

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

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

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

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

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

Спасибо вы мне помогли .
...
Рейтинг: 0 / 0
04.10.2018, 12:08
    #39712910
MaximaXXL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подзапрос и ORA-01427
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
04.10.2018, 12:33
    #39712926
MaximaXXL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подзапрос и ORA-01427
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
04.10.2018, 12:47
    #39712945
maverick2104
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подзапрос и ORA-01427
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
04.10.2018, 13:11
    #39712961
MaximaXXL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подзапрос и ORA-01427
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
04.10.2018, 14:45
    #39713032
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подзапрос и ORA-01427
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
04.10.2018, 15:05
    #39713045
MaximaXXL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подзапрос и ORA-01427
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
04.10.2018, 15:33
    #39713074
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подзапрос и ORA-01427
MaximaXXLДа, max вернет 1 запись и не обязательно ВЧЕРА. А посему надо искать дубли глубже чем вчера


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

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


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