Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Oracle |
![]() ![]() |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
IronMike Member Откуда: Сообщений: 27 |
Всем привет! Перезаливаю базу измененными значениями за несколько лет (через update). Пару первых лет перезалил без проблем. А вот при обновлении текущего года выдает ошибку Ошибка ORA-01427: подзапрос одиночной строки возвращает более одной строки. Но таблица, которая формируется кодом для обновления - уникальна (если объединить все строки и попробовать найти дубликаты, то их не будет). Подскажите, пожалуйста, почему происходит такая ошибка при обновлении таблицы? |
17 окт 19, 20:25 [21996913] Ответить | Цитировать Сообщить модератору |
-2- Member Откуда: Сообщений: 15330 |
|
||
17 окт 19, 21:28 [21996951] Ответить | Цитировать Сообщить модератору |
dmdmdm Member Откуда: Нижний Новгород Сообщений: 1692 |
Без конкретного запроса - "Дорогие учёные. У меня который год в подполе происходит подземный стук. Объясните, пожалуйста, как он происходит". |
17 окт 19, 21:30 [21996952] Ответить | Цитировать Сообщить модератору |
SY Member Откуда: Middlebury, CT USA Сообщений: 10122 |
IronMike, Ну так возьми запусти подзапрос и посмотри сколько и какие строки он возвращает. Это даст начальную информацию что пошло не так как "Пару первых лет". SY. |
17 окт 19, 21:32 [21996953] Ответить | Цитировать Сообщить модератору |
Elic Member Откуда: Сообщений: 30057 |
RTFM |
||
18 окт 19, 07:43 [21997037] Ответить | Цитировать Сообщить модератору |
IronMike Member Откуда: Сообщений: 27 |
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] Ответить | Цитировать Сообщить модератору |
Stax Member Откуда: Ukraine,Lviv Сообщений: 2960 |
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] Ответить | Цитировать Сообщить модератору |
-2- Member Откуда: Сообщений: 15330 |
|
||
18 окт 19, 10:54 [21997192] Ответить | Цитировать Сообщить модератору |
IronMike Member Откуда: Сообщений: 27 |
Stax, Возвращает 2 ошибки: - столбец определен неоднозначно - неверно предложение на языке SQL |
18 окт 19, 10:55 [21997193] Ответить | Цитировать Сообщить модератору |
Elic Member Откуда: Сообщений: 30057 |
|
||||
18 окт 19, 10:58 [21997199] Ответить | Цитировать Сообщить модератору |
IronMike Member Откуда: Сообщений: 27 |
Elic, Да не, я запускал подзапрос, выгружал его в Excel, и соединял строки по этим 4-м критериям: ни одной повторяющейся не было |
18 окт 19, 11:02 [21997205] Ответить | Цитировать Сообщить модератору |
Elic Member Откуда: Сообщений: 30057 |
|
||||
18 окт 19, 11:02 [21997207] Ответить | Цитировать Сообщить модератору |
IgorSm Member Откуда: Сообщений: 85 |
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] Ответить | Цитировать Сообщить модератору |
Stax Member Откуда: Ukraine,Lviv Сообщений: 2960 |
добавте нужный алиас Вам надо селестом повторить update (найти где возвращает более одной строки.) ..... stax |
||
18 окт 19, 11:18 [21997224] Ответить | Цитировать Сообщить модератору |
dmdmdm Member Откуда: Нижний Новгород Сообщений: 1692 |
Чудес не бывает.
Отделите select от update и проверьте. Есть волшебные средства PL/SQL Beautifier.
|
|||||
18 окт 19, 11:23 [21997233] Ответить | Цитировать Сообщить модератору |
Stax Member Откуда: Ukraine,Lviv Сообщений: 2960 |
IgorSm, недоглядел ; ![]() но сути не меняет, надо повторить логику update .... stax |
18 окт 19, 11:28 [21997244] Ответить | Цитировать Сообщить модератору |
IronMike Member Откуда: Сообщений: 27 |
IgorSm, здесь тоже какие-то опечатки есть - выдает аналогичную ошибку |
18 окт 19, 12:17 [21997300] Ответить | Цитировать Сообщить модератору |
Stax Member Откуда: Ukraine,Lviv Сообщений: 2960 |
надо акуратненько избавится от ошибок типа 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] Ответить | Цитировать Сообщить модератору |
Elic Member Откуда: Сообщений: 30057 |
А Станислав - тряпка. Всякое чмо его гнобит, а он ещё и извиняется. |
||
18 окт 19, 12:48 [21997333] Ответить | Цитировать Сообщить модератору |
IronMike Member Откуда: Сообщений: 27 |
Stax, Сейчас выдает ошибку "таблица или представление пользователя не существует" |
18 окт 19, 12:53 [21997341] Ответить | Цитировать Сообщить модератору |
IronMike Member Откуда: Сообщений: 27 |
Elic, Я обратился за помощью к форуму, так как я не знаю как решить эту задачу. Конкретно тебя я не звал на помощь. |
18 окт 19, 12:55 [21997345] Ответить | Цитировать Сообщить модератору |
Elic Member Откуда: Сообщений: 30057 |
|
||
18 окт 19, 13:00 [21997351] Ответить | Цитировать Сообщить модератору |
123йй Member Откуда: Сообщений: 1663 |
ИМХО. Такую же ошибку получат почти 100% кто попробует выполнить твой код. |
||
18 окт 19, 13:03 [21997355] Ответить | Цитировать Сообщить модератору |
Stax Member Откуда: Ukraine,Lviv Сообщений: 2960 |
акуратненько где надо дорисуйте 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] Ответить | Цитировать Сообщить модератору |
IronMike Member Откуда: Сообщений: 27 |
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 | ![]() |