powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Ошибка ORA-01427
25 сообщений из 35, страница 1 из 2
Ошибка ORA-01427
    #39877899
IronMike
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет!

Перезаливаю базу измененными значениями за несколько лет (через update). Пару первых лет перезалил без проблем. А вот при обновлении текущего года выдает ошибку Ошибка ORA-01427: подзапрос одиночной строки возвращает более одной строки.
Но таблица, которая формируется кодом для обновления - уникальна (если объединить все строки и попробовать найти дубликаты, то их не будет).

Подскажите, пожалуйста, почему происходит такая ошибка при обновлении таблицы?
...
Рейтинг: 0 / 0
Ошибка ORA-01427
    #39877926
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IronMikeпочему происходит такая ошибкаочевидно же
...
Рейтинг: 0 / 0
Ошибка ORA-01427
    #39877927
dmdmdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Без конкретного запроса - "Дорогие учёные. У меня который год в подполе происходит подземный стук. Объясните, пожалуйста, как он происходит".
...
Рейтинг: 0 / 0
Ошибка ORA-01427
    #39877928
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IronMike,

Ну так возьми запусти подзапрос и посмотри сколько и какие строки он возвращает. Это даст начальную информацию что пошло не так как "Пару первых лет".

SY.
...
Рейтинг: 0 / 0
Ошибка ORA-01427
    #39877990
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IronMikeПодскажите, пожалуйста, почему происходит такая ошибка при обновлении таблицы?Потому что автор - альтернативно одарённый хомо эректус.

http://www.bugtraq.ru/forum/faq/general/smart-questions.html] RTFM
...
Рейтинг: 0 / 0
Ошибка ORA-01427
    #39878066
IronMike
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SY,

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

Вот сам код:

update dsbd_margin_trans t1
set (t1.mdr,t1.id_saler)=(select MDR,id_saler from (SELECT t.dt, t.grafnum, t.id_pos, t.id_saler,sum(amount) as amount,
sum(CASE WHEN t.id_type=1 THEN det.reward ELSE det.reward*-1 END)+sum(CASE WHEN t.id_type=1 THEN det.discount ELSE det.discount*-1 END) AS MDR
FROM (select * from transit2.trans@sun where id_cont in ('8CAAEFEA6E0C4D1094B1139F182B6AF1','EF5D606A6E1A47E0AEC712CFF89B030F', '64B1A95E8E244EBDE053044A14ACEA8A')) t
JOIN transit2.services@sun ser ON ser.id_usl = t.id_usl
LEFT JOIN transit2.trans_detail@sun det ON det.id_trans=t.id_trans and det.id_type=3
WHERE ser.uname = 'л' AND t.grafnum > 0 AND t.id_type!=3
GROUP BY t.dt, t.grafnum, t.id_pos, t.id_saler) t2
where t1.grafnum=t2.grafnum and t1.id_pos=t2.id_pos and t1.dt=t2.dt and t1.amount=t2.amount)
where t1.main_id in (select id_cont from v_tmp_business_products where nvl(name_business,0)='GPC RUS')
and (t1.dt >= date '2019-04-01' and t1.dt < date '2019-04-05');
commit

До даты в фильтре ошибку не выдавал, все обновлял успешно
...
Рейтинг: 0 / 0
Ошибка ORA-01427
    #39878084
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IronMikeSY,


Вот сам код:

До даты в фильтре ошибку не выдавал, все обновлял успешно

select t1.rowid,count(*) cc from
--update dsbd_margin_trans t1 set (t1.mdr,t1.id_saler)=
(select MDR,id_saler from (SELECT t.dt, t.grafnum, t.id_pos, t.id_saler,sum(amount) as amount,
sum(CASE WHEN t.id_type=1 THEN det.reward ELSE det.reward*-1 END)+sum(CASE WHEN t.id_type=1 THEN det.discount ELSE det.discount*-1 END) AS MDR
FROM (select * from transit2.trans@sun where id_cont in ('8CAAEFEA6E0C4D1094B1139F182B6AF1','EF5D606A6E1A47E0AEC712CFF89B030F', '64B1A95E8E244EBDE053044A14ACEA8A')) t
JOIN transit2.services@sun ser ON ser.id_usl = t.id_usl
LEFT JOIN transit2.trans_detail@sun det ON det.id_trans=t.id_trans and det.id_type=3
WHERE ser.uname = 'л' AND t.grafnum > 0 AND t.id_type!=3
GROUP BY t.dt, t.grafnum, t.id_pos, t.id_saler) t2
,dsbd_margin_trans t1
where t1.grafnum=t2.grafnum and t1.id_pos=t2.id_pos and t1.dt=t2.dt and t1.amount=t2.amount)
where t1.main_id in (select id_cont from v_tmp_business_products where nvl(name_business,0)='GPC RUS')
and (t1.dt >= date '2019-04-01' and t1.dt < date '2019-04-05');
group by t1.rowid
having count(*)>1


что-то возвращает?

.....
stax
...
Рейтинг: 0 / 0
Ошибка ORA-01427
    #39878087
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IronMikeсам кодЕсли на t.dt, t.grafnum, t.id_pos допускается несколько t.id_saler, то может получиться несколько строк.
...
Рейтинг: 0 / 0
Ошибка ORA-01427
    #39878088
IronMike
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax,
Возвращает 2 ошибки:
- столбец определен неоднозначно
- неверно предложение на языке SQL
...
Рейтинг: 0 / 0
Ошибка ORA-01427
    #39878094
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IronMikeВ этом и суть, что строки уникальные получаются.Заблуждаешься.

IronMike
Код: plsql
1.
2.
                 GROUP BY t.dt, t.grafnum, t.id_pos, t.id_saler) t2
                 where t1.grafnum=t2.grafnum and t1.id_pos=t2.id_pos and t1.dt=t2.dt and t1.amount=t2.amount)

Два продавца до поры до времени сидели в засаде, а потом устроили подлянку говнокоду, продав на одинаковую сумму.
...
Рейтинг: 0 / 0
Ошибка ORA-01427
    #39878100
IronMike
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Elic,
Да не, я запускал подзапрос, выгружал его в Excel, и соединял строки по этим 4-м критериям: ни одной повторяющейся не было
...
Рейтинг: 0 / 0
Ошибка ORA-01427
    #39878102
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IronMikeДа не, я запускал подзапрос, выгружал его в Excel, и соединял строки по этим 4-м критериям: ни одной повторяющейся не былоElicЗаблуждаешься.
...
Рейтинг: 0 / 0
Ошибка ORA-01427
    #39878109
IgorSm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax,
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
select t1.rowid,count(*) cc from
--update dsbd_margin_trans t1 set (t1.mdr,t1.id_saler)=
(select MDR,id_saler from (SELECT t.dt, t.grafnum, t.id_pos, t.id_saler,sum(amount) as amount,
sum(CASE WHEN t.id_type=1 THEN det.reward ELSE det.reward*-1 END)+sum(CASE WHEN t.id_type=1 THEN det.discount ELSE det.discount*-1 END) AS MDR
FROM (select * from transit2.trans@sun where id_cont in ('8CAAEFEA6E0C4D1094B1139F182B6AF1','EF5D606A6E1A47E0AEC712CFF89B030F', '64B1A95E8E244EBDE053044A14ACEA8A')) t
JOIN transit2.services@sun ser ON ser.id_usl = t.id_usl
LEFT JOIN transit2.trans_detail@sun det ON det.id_trans=t.id_trans and det.id_type=3
WHERE ser.uname = 'л' AND t.grafnum > 0 AND t.id_type!=3
GROUP BY t.dt, t.grafnum, t.id_pos, t.id_saler) t2
,dsbd_margin_trans t1
where t1.grafnum=t2.grafnum and t1.id_pos=t2.id_pos and t1.dt=t2.dt and t1.amount=t2.amount)
where t1.main_id in (select id_cont from v_tmp_business_products where nvl(name_business,0)='GPC RUS')
and (t1.dt >= date '2019-04-01' and t1.dt < date '2019-04-05')[color=red];[/color]
group by t1.rowid



Досадная опечатка о которой не догадался автор сего поста.

С глубоким уважением к Stax.
...
Рейтинг: 0 / 0
Ошибка ORA-01427
    #39878117
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IronMikeStax,
Возвращает 2 ошибки:
- столбец определен неоднозначно
- неверно предложение на языке SQL
добавте нужный алиас

Вам надо селестом повторить update (найти где возвращает более одной строки.)


.....
stax
...
Рейтинг: 0 / 0
Ошибка ORA-01427
    #39878125
dmdmdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IronMikeВ этом и суть, что строки уникальные получаются.

Чудес не бывает.

IronMikeupdate dsbd_margin_trans t1
set (t1.mdr,t1.id_saler)=(select MDR,id_saler from (

Отделите select от update и проверьте.

Есть волшебные средства PL/SQL Beautifier.
Код: 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.
update dsbd_margin_trans t1
   set (t1.mdr, t1.id_saler) =
       (select MDR, id_saler
          from (SELECT t.dt,
                       t.grafnum,
                       t.id_pos,
                       t.id_saler,
                       sum(amount) as amount,
                       sum(CASE
                             WHEN t.id_type = 1 THEN
                              det.reward
                             ELSE
                              det.reward * -1
                           END) + sum(CASE
                                        WHEN t.id_type = 1 THEN
                                         det.discount
                                        ELSE
                                         det.discount * -1
                                      END) AS MDR
                  FROM (select *
                          from transit2.trans@sun
                         where id_cont in
                               ('8CAAEFEA6E0C4D1094B1139F182B6AF1',
                                'EF5D606A6E1A47E0AEC712CFF89B030F',
                                '64B1A95E8E244EBDE053044A14ACEA8A')) t
                  JOIN transit2.services@sun ser
                    ON ser.id_usl = t.id_usl
                  LEFT JOIN transit2.trans_detail@sun det
                    ON det.id_trans = t.id_trans
                   and det.id_type = 3
                 WHERE ser.uname = 'л'
                   AND t.grafnum > 0
                   AND t.id_type != 3
                 GROUP BY t.dt, t.grafnum, t.id_pos, t.id_saler) t2
         where t1.grafnum = t2.grafnum
           and t1.id_pos = t2.id_pos
           and t1.dt = t2.dt
           and t1.amount = t2.amount)
 where t1.main_id in
       (select id_cont
          from v_tmp_business_products
         where nvl(name_business, 0) = 'GPC RUS')
   and (t1.dt >= date '2019-04-01' and t1.dt < date '2019-04-05');

...
Рейтинг: 0 / 0
Ошибка ORA-01427
    #39878133
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IgorSm,

недоглядел ;

но сути не меняет, надо повторить логику update

....
stax
...
Рейтинг: 0 / 0
Ошибка ORA-01427
    #39878176
IronMike
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IgorSm,

здесь тоже какие-то опечатки есть - выдает аналогичную ошибку
...
Рейтинг: 0 / 0
Ошибка ORA-01427
    #39878200
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IronMikeIgorSm,

здесь тоже какие-то опечатки есть - выдает аналогичную ошибку

надо акуратненько избавится от ошибок
типа
select r,count(*) cc from
--update dsbd_margin_trans t1 set (t1.mdr,t1.id_saler)=
(select MDR,id_saler,t1.dt,main_id,t1.rowid r from (SELECT t.dt, t.grafnum, t.id_pos, t.id_saler,sum(amount) as amount,
sum(CASE WHEN t.id_type=1 THEN det.reward ELSE det.reward*-1 END)+sum(CASE WHEN t.id_type=1 THEN det.discount ELSE det.discount*-1 END) AS MDR
FROM (select * from trans where id_cont in ('8CAAEFEA6E0C4D1094B1139F182B6AF1','EF5D606A6E1A47E0AEC712CFF89B030F', '64B1A95E8E244EBDE053044A14ACEA8A')) t
JOIN services ser ON ser.id_usl = t.id_usl
LEFT JOIN trans_detail det ON det.id_trans=t.id_trans and det.id_type=3
WHERE ser.uname = 'л' AND t.grafnum > 0 AND t.id_type!=3
GROUP BY t.dt, t.grafnum, t.id_pos, t.id_saler) t2
,dsbd_margin_trans t1
where t1.grafnum=t2.grafnum and t1.id_pos=t2.id_pos and t1.dt=t2.dt and t1.amount=t2.amount)
where main_id in (select id_cont from v_tmp_business_products where nvl(name_business,0)='GPC RUS')
and (dt >= date '2019-04-01' and dt < date '2019-04-05')
group by r
having count(*)>1
/

какую ошибку выдает?

.....
stax
...
Рейтинг: 0 / 0
Ошибка ORA-01427
    #39878201
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IronMikeздесь тоже какие-то опечатки есть - выдает аналогичную ошибкуНу так включи уже мозг, начни помогать себе сам.

А Станислав - тряпка. Всякое чмо его гнобит, а он ещё и извиняется.
...
Рейтинг: 0 / 0
Ошибка ORA-01427
    #39878206
IronMike
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax,
Сейчас выдает ошибку "таблица или представление пользователя не существует"
...
Рейтинг: 0 / 0
Ошибка ORA-01427
    #39878209
IronMike
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Elic,
Я обратился за помощью к форуму, так как я не знаю как решить эту задачу.
Конкретно тебя я не звал на помощь.
...
Рейтинг: 0 / 0
Ошибка ORA-01427
    #39878213
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IronMikeКонкретно тебя я не звал на помощь.Это публичный форум. Но оставаться на ручнике - это твоё неотъемлемое право.
...
Рейтинг: 0 / 0
Ошибка ORA-01427
    #39878216
123йй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IronMikeСейчас выдает ошибку "таблица или представление пользователя не существует"
ИМХО. Такую же ошибку получат почти 100% кто попробует выполнить твой код.
...
Рейтинг: 0 / 0
Ошибка ORA-01427
    #39878238
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IronMikeStax,
Сейчас выдает ошибку "таблица или представление пользователя не существует"

акуратненько где надо дорисуйте transit2,@sun
(у меня нет Ваших таблиц/схем/баз)


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

1) создать дубль таблички create table dsbd_margin_trans2 AS select * from dsbd_margin_trans ;
2) добавить отладочный столбец
alter table dsbd_margin_trans2 ADD (cc int);
3) update тестовой таблички

update dsbd_margin_trans2 t1
set (t1.mdr,t1.id_saler,cc)=(select max(MDR),MAX(id_saler).count(*) from (SELECT ...

4) глянуть где/для кого "двоит"
select * from dsbd_margin_trans2 where cc>1

5) принять меры ...


.....
stax
...
Рейтинг: 0 / 0
Ошибка ORA-01427
    #39878249
IronMike
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax,

Я не понимаю этой части кода (выделил цветом):

select t1.rowid,count(*) cc from
--update dsbd_margin_trans t1 set (t1.mdr,t1.id_saler)=
(select MDR,id_saler from (SELECT t.dt, t.grafnum, t.id_pos, t.id_saler,sum(amount) as amount,
sum(CASE WHEN t.id_type=1 THEN det.reward ELSE det.reward*-1 END)+sum(CASE WHEN t.id_type=1 THEN det.discount ELSE det.discount*-1 END) AS MDR
FROM (select * from transit2.trans@sun where id_cont in ('8CAAEFEA6E0C4D1094B1139F182B6AF1','EF5D606A6E1A47E0AEC712CFF89B030F', '64B1A95E8E244EBDE053044A14ACEA8A')) t
JOIN transit2.services@sun ser ON ser.id_usl = t.id_usl
LEFT JOIN transit2.trans_detail@sun det ON det.id_trans=t.id_trans and det.id_type=3
WHERE ser.uname = 'л' AND t.grafnum > 0 AND t.id_type!=3
GROUP BY t.dt, t.grafnum, t.id_pos, t.id_saler) t2
,dsbd_margin_trans t1
where t1.grafnum=t2.grafnum and t1.id_pos=t2.id_pos and t1.dt=t2.dt and t1.amount=t2.amount)
where t1.main_id in (select id_cont from v_tmp_business_products where nvl(name_business,0)='GPC RUS')
and (t1.dt >= date '2019-04-01' and t1.dt < date '2019-04-05');
group by t1.rowid

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


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