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

Откуда:
Сообщений: 25
Всем привет!

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

Подскажите, пожалуйста, почему происходит такая ошибка при обновлении таблицы?
17 окт 19, 20:25    [21996913]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка ORA-01427  [new]
-2-
Member

Откуда:
Сообщений: 15020
IronMike
почему происходит такая ошибка
очевидно же
17 окт 19, 21:28    [21996951]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка ORA-01427  [new]
dmdmdm
Member

Откуда: Нижний Новгород
Сообщений: 1362
Без конкретного запроса - "Дорогие учёные. У меня который год в подполе происходит подземный стук. Объясните, пожалуйста, как он происходит".
17 окт 19, 21:30    [21996952]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка ORA-01427  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 9642
IronMike,

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

SY.
17 окт 19, 21:32    [21996953]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка ORA-01427  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 29435
IronMike
Подскажите, пожалуйста, почему происходит такая ошибка при обновлении таблицы?
Потому что автор - альтернативно одарённый хомо эректус.

RTFM
18 окт 19, 07:43    [21997037]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка ORA-01427  [new]
IronMike
Member

Откуда:
Сообщений: 25
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

До даты в фильтре ошибку не выдавал, все обновлял успешно
18 окт 19, 10:33    [21997162]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка ORA-01427  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 2035
IronMike
SY,


Вот сам код:

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


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
18 окт 19, 10:51    [21997189]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка ORA-01427  [new]
-2-
Member

Откуда:
Сообщений: 15020
IronMike
сам код
Если на t.dt, t.grafnum, t.id_pos допускается несколько t.id_saler, то может получиться несколько строк.
18 окт 19, 10:54    [21997192]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка ORA-01427  [new]
IronMike
Member

Откуда:
Сообщений: 25
Stax,
Возвращает 2 ошибки:
- столбец определен неоднозначно
- неверно предложение на языке SQL
18 окт 19, 10:55    [21997193]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка ORA-01427  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 29435
IronMike
В этом и суть, что строки уникальные получаются.
Заблуждаешься.

IronMike
                 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)
Два продавца до поры до времени сидели в засаде, а потом устроили подлянку говнокоду, продав на одинаковую сумму.
18 окт 19, 10:58    [21997199]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка ORA-01427  [new]
IronMike
Member

Откуда:
Сообщений: 25
Elic,
Да не, я запускал подзапрос, выгружал его в Excel, и соединял строки по этим 4-м критериям: ни одной повторяющейся не было
18 окт 19, 11:02    [21997205]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка ORA-01427  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 29435
IronMike
Да не, я запускал подзапрос, выгружал его в Excel, и соединял строки по этим 4-м критериям: ни одной повторяющейся не было
Elic
Заблуждаешься.
18 окт 19, 11:02    [21997207]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка ORA-01427  [new]
IgorSm
Member

Откуда:
Сообщений: 82
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')[color=red];[/color]
group by t1.rowid


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

С глубоким уважением к Stax.
18 окт 19, 11:09    [21997215]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка ORA-01427  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 2035
IronMike
Stax,
Возвращает 2 ошибки:
- столбец определен неоднозначно
- неверно предложение на языке SQL

добавте нужный алиас

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


.....
stax
18 окт 19, 11:18    [21997224]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка ORA-01427  [new]
dmdmdm
Member

Откуда: Нижний Новгород
Сообщений: 1362
IronMike
В этом и суть, что строки уникальные получаются.


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

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


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

Есть волшебные средства PL/SQL Beautifier.
+
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');
18 окт 19, 11:23    [21997233]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка ORA-01427  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 2035
IgorSm,

недоглядел ;

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

....
stax
18 окт 19, 11:28    [21997244]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка ORA-01427  [new]
IronMike
Member

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

здесь тоже какие-то опечатки есть - выдает аналогичную ошибку
18 окт 19, 12:17    [21997300]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка ORA-01427  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 2035
IronMike
IgorSm,

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


надо акуратненько избавится от ошибок
типа
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
18 окт 19, 12:48    [21997332]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка ORA-01427  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 29435
IronMike
здесь тоже какие-то опечатки есть - выдает аналогичную ошибку
Ну так включи уже мозг, начни помогать себе сам.

А Станислав - тряпка. Всякое чмо его гнобит, а он ещё и извиняется.
18 окт 19, 12:48    [21997333]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка ORA-01427  [new]
IronMike
Member

Откуда:
Сообщений: 25
Stax,
Сейчас выдает ошибку "таблица или представление пользователя не существует"
18 окт 19, 12:53    [21997341]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка ORA-01427  [new]
IronMike
Member

Откуда:
Сообщений: 25
Elic,
Я обратился за помощью к форуму, так как я не знаю как решить эту задачу.
Конкретно тебя я не звал на помощь.
18 окт 19, 12:55    [21997345]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка ORA-01427  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 29435
IronMike
Конкретно тебя я не звал на помощь.
Это публичный форум. Но оставаться на ручнике - это твоё неотъемлемое право.
18 окт 19, 13:00    [21997351]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка ORA-01427  [new]
123йй
Member

Откуда:
Сообщений: 1565
IronMike
Сейчас выдает ошибку "таблица или представление пользователя не существует"

ИМХО. Такую же ошибку получат почти 100% кто попробует выполнить твой код.
18 окт 19, 13:03    [21997355]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка ORA-01427  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 2035
IronMike
Stax,
Сейчас выдает ошибку "таблица или представление пользователя не существует"


акуратненько где надо дорисуйте 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
18 окт 19, 13:32    [21997391]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка ORA-01427  [new]
IronMike
Member

Откуда:
Сообщений: 25
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 точно на своем месте?
18 окт 19, 13:44    [21997406]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Oracle Ответить