Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как соединить две таблицы (ORACLE) / 25 сообщений из 25, страница 1 из 1
09.09.2019, 17:33
    #39859469
chris0609
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как соединить две таблицы (ORACLE)
заполнить колонку D данными из B, первые символы A и C равны, но количество одинаковых символов меняется
...
Рейтинг: 0 / 0
09.09.2019, 17:59
    #39859485
dmdmdm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как соединить две таблицы (ORACLE)
Покажите хоть что-то, сделанное вами, чтобы появилось желание вам помогать.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
with t(a, b, c, d) as (
select 'qwe', 'ert', 'etr', null from dual union all
select 'wea', 'egf', 'ocr', null from dual union all
select 'ety', 'ret', 'abc', null from dual union all
select 'ews', 'rat', 'qqq', null from dual union all
select 'zxc', 'root', 'zzz', null from dual
)
select a, substr(a, 1, 1) a1, b, c, d from t



Студентам, желающим помощи .
...
Рейтинг: 0 / 0
09.09.2019, 18:01
    #39859488
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как соединить две таблицы (ORACLE)
chris0609заполнить колонку D данными из B, первые символы A и C равны, но количество одинаковых символов меняется

Кто нибудь хоть что нибудь понял?
...
Рейтинг: 0 / 0
09.09.2019, 18:07
    #39859491
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как соединить две таблицы (ORACLE)
При выполнении условия key-preserved rows - update по динамическому представлению.
Иначе - merge statement (для версий сервера, поддерживающих merge)
Универсально - PL/SQL.
...
Рейтинг: 0 / 0
09.09.2019, 18:10
    #39859492
Maxim Demenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как соединить две таблицы (ORACLE)
chris0609,
А количество меняется в сторону увеличения или в сторону уменьшения ?

Regards

Maxim
...
Рейтинг: 0 / 0
09.09.2019, 19:02
    #39859533
chris0609
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как соединить две таблицы (ORACLE)
dmdmdm,
Извиняюсь, фото не загрузилось
Таб1
A B
750 ccc
750 ccc
26 qq
3450 tt
12 yy

Таб2
C D
750443
7503
2620
2645
345046
34506653
1265

Результат:
Таб2
C D
750443 ccc
7503 ccc
2620 qq
2645 qq
345046 tt
34506653 tt
1265 yy
...
Рейтинг: 0 / 0
09.09.2019, 22:29
    #39859611
iOracleDev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как соединить две таблицы (ORACLE)
Leonid KudryavtsevКто нибудь хоть что нибудь понял?
Понял, автор топика канадец у них канабис легализован
...
Рейтинг: 0 / 0
10.09.2019, 08:53
    #39859669
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как соединить две таблицы (ORACLE)
Leonid KudryavtsevКто нибудь хоть что нибудь понял?
1)есть две таблички
tab1(a varchar2(20),b varchar2(20))
tab2(c varchar2(20),d varchar2(20))

2) в таблічке 2 заполнить поле d значением b при условии "максимального" like
напр
Таб1
A B
750 ccc
7504 ччч

Таб2
C D
750 null
750443 null

результат
Таб2
C D
750 ccc
750443 ччч

.....
stax
...
Рейтинг: 0 / 0
10.09.2019, 09:19
    #39859676
andreymx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как соединить две таблицы (ORACLE)
Leonid Kudryavtsevchris0609заполнить колонку D данными из B, первые символы A и C равны, но количество одинаковых символов меняется

Кто нибудь хоть что нибудь понял?

авторвот ещё нам вчера новую игру привезли, э-э-э.., "Стимулируй сам". Очень интересно.
— А как в неё играть?
— Там всё написано в объяснении. "Трое играющих берут четыре фишки, причём пятый игрок всё время выкидывает... После того как лиса оказывается съеденной, она делает четыре хода назад..."
...
Рейтинг: 0 / 0
10.09.2019, 09:21
    #39859678
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как соединить две таблицы (ORACLE)
chris0609,

Код: 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.
SQL> ed
Wrote file afiedt.buf

  1  with tab1(a,b) as (
  2  select '750','ccc' from dual union all
  3  select '7504','xxx' from dual union all
  4  select '26','qq' from dual union all
  5  select '3450','tt' from dual union all
  6  select '12','yy' from dual)
  7  ,tab2 (c) as (
  8  select '750443' from dual union all
  9  select '7503' from dual union all
 10  select '2620' from dual union all
 11  select '2645' from dual union all
 12  select '345046' from dual union all
 13  select '34506653' from dual union all
 14  select '1265' from dual
 15  )
 16  select
 17    t2.c
 18   ,(select max(b) KEEP (DENSE_RANK LAST ORDER BY length(t1.a))
 19     from tab1 t1 where t2.c like t1.a||'%') d
 20* from tab2 t2
SQL> /

C        D
-------- ---
750443   xxx
7503     ccc
2620     qq
2645     qq
345046   tt
34506653 tt
1265     yy

7 rows selected.



....
stax
...
Рейтинг: 0 / 0
10.09.2019, 12:26
    #39859776
chris0609
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как соединить две таблицы (ORACLE)
Таб1
..A.......................B
750....................aaa
750....................aaa
26......................bbb
3450..................ccc
3450..................ccc
12......................q
12......................q


Таб2
....C....................D
7503546
75043111
7507895
7501478
264545
26777
26147
34506273
3450543
128887
1294387


Результат:
.....C...................D
7503546............aaa
75043111...........aaa
7507895............aaa
7501478............aaa
264545..............bbb
26777................bbb
26147................bbb
34506273..........ccc
3450543............ccc
128887..............q
1294387............q
...
Рейтинг: 0 / 0
10.09.2019, 12:46
    #39859788
Oleg M.Ivanov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как соединить две таблицы (ORACLE)
Смахивает на билинг звонков, типа, по префиксу надо найти прайс.
...
Рейтинг: 0 / 0
10.09.2019, 12:58
    #39859800
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как соединить две таблицы (ORACLE)
chris0609,

чем не устраивает 21967446 ?

....
stax
...
Рейтинг: 0 / 0
10.09.2019, 12:59
    #39859803
Oleg M.Ivanov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как соединить две таблицы (ORACLE)
Oleg M.IvanovСмахивает на билинг звонков, типа, по префиксу надо найти прайс.
Не дописал сразу, дополню.
В таком случае курсором тянем значения из C и каждое число в цикле обрезаем с хвоста до тех пор, пока не найдется совпадение в А.
Так обычно билинги работают, задача очень похожа, но одним селектом не решить.
...
Рейтинг: 0 / 0
10.09.2019, 14:02
    #39859848
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как соединить две таблицы (ORACLE)
Oleg M.IvanovВ таком случае курсором тянем значения из C и каждое число в цикле обрезаем с хвоста до тех пор, пока не найдется совпадение в А.
Так обычно билинги работают
...иногда лучше молчать...
...
Рейтинг: 0 / 0
10.09.2019, 14:25
    #39859859
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как соединить две таблицы (ORACLE)
Stax
Код: plsql
1.
2.
3.
4.
5.
SQL>  16  select
 17    t2.c
 18   ,(select max(b) KEEP (DENSE_RANK LAST ORDER BY length(t1.a))
 19     from tab1 t1 where t2.c like t1.a||'%') d
 20* from tab2 t2




Проще надо быть :)
Вешаем индекс на tab1(a,b)
nls_sort, nls_comp в binary не забываем и:
Код: plsql
1.
2.
3.
select c,d 
 from tab2
    , lateral(select b D from tab1 where a<=c order by a desc fetch first 1 row only)



Лет несколько назад очень популярная тема была, причем в те годы вариант с единственным фетчем курсора в pl/sql брал верх над чисто-sql решениями...
Плюс Саян отличный обзор методов получения top-n (top-1 в данном случае) публиковал.

Однако ТС, судя по косвенным, хочет merge в tab2, а не просто join.
...
Рейтинг: 0 / 0
10.09.2019, 15:01
    #39859880
Oleg M.Ivanov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как соединить две таблицы (ORACLE)
Код: 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.
create table tab1 ( a  number, b  varchar2(10));
create index idx_a on tab1(a);
insert into tab1 (a, b) values (750, 'aaa');
insert into tab1 (a, b) values (750, 'aaa');
insert into tab1 (a, b) values (26, 'bbb');
insert into tab1 (a, b) values (3450, 'ccc');
insert into tab1 (a, b) values (3450, 'ccc');
insert into tab1 (a, b) values (12, 'q');
insert into tab1 (a, b) values (12, 'q');
commit;

create table tab2( c  number, d  varchar2(10));

insert into tab2(c) values (7503546);
insert into tab2(c) values (75043111);
insert into tab2(c) values (7507895);
insert into tab2(c) values (7501478);
insert into tab2(c) values (264545);
insert into tab2(c) values (26777);
insert into tab2(c) values (26147);
insert into tab2(c) values (34506273);
insert into tab2(c) values (3450543);
insert into tab2(c) values (128887);
insert into tab2(c) values (1294387);
commit;

declare
v_c  number;
v_d  varchar2(10);
v_r rowid;
i number;
cursor v_cursor is 
select rowid,c from tab2;

 begin
  open v_cursor;
 loop
  begin
   fetch v_cursor into v_r,v_c;
   i:=length(v_c);
   v_d:=null;
   
   while i>1 and v_d is null loop 
             --dbms_output.put_line(v_c);
        begin     
        select nvl(b,0) into v_d from tab1 where a=v_c and rownum<2;
          exception when others then null;   
        end;
        i:=i-1;      
        v_c:= substr(v_c,1,i);
   end loop;
   if v_d is not null then
     begin
      update tab2 set d=v_d where rowid=v_r;
     end;
   end if;
  end; 
     exit when v_cursor%NOTFOUND;
   end loop;
  close v_cursor;
 end;    

describe tab2;


CD7503546aaa75043111aaa7507895aaa7501478aaa264545bbb26777bbb26147bbb34506273ccc3450543ccc128887q1294387q
...
Рейтинг: 0 / 0
10.09.2019, 15:06
    #39859888
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как соединить две таблицы (ORACLE)
Oleg M.Ivanov
Код: plsql
1.
cursor

Сам по себе гуано-код, отягощённый говнокодищем:
Oleg M.Ivanov
Код: plsql
1.
when others then null;

и бездарностью:
Oleg M.Ivanov
Код: plsql
1.
2.
     exit when v_cursor%NOTFOUND;
   end loop;
...
Рейтинг: 0 / 0
10.09.2019, 15:14
    #39859894
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как соединить две таблицы (ORACLE)
andrey_anonymousПроще надо быть :)
...
Однако ТС, судя по косвенным, хочет merge в tab2, а не просто join.
можно и так
пока нету у меня латерала
я специально подзапросиком делал, мож пригодится для update (заполнить колонку D)

.....
stax
...
Рейтинг: 0 / 0
10.09.2019, 15:34
    #39859903
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как соединить две таблицы (ORACLE)
Oleg M.Ivanov
Код: plsql
1.
   while i>1 and v_d is null loop 




Олег, ну попробуйте немного подумать...
Код: 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.
declare
  type ta_dic is table of varchar2(20) index by varchar2(30);
  la_dic ta_dic;
  l_idx varchar2(30);
  cursor c_data is 
    select c from tab2 
     where d is null 
       for update;
 begin
   -- готовим ассоциативный справочник
   for i in (select a,b from tab1) loop
     la_dic(i.a) := i.b;
   end loop;
   -- крутим наждак:
   for i in c_data loop
     l_idx := la_dic.prior(i.c);
     if instr(i.c,l_idx) = 1 then
       update dropme_t2 
          set d = la_dic(l_idx) 
        where current of c_data
       ;
     end if;
   end loop;
end;
...
Рейтинг: 0 / 0
10.09.2019, 15:39
    #39859908
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как соединить две таблицы (ORACLE)
andrey_anonymousОлег, ну попробуйте
А если Вы имели ввиду потроллить ТС, то
Код: plsql
1.
2.
3.
4.
5.
6.
begin
  for i in (select * from tab1 order by length(a)) loop
    update tab2 set d=i.b
     where c like i.a||'%';
  end loop;
end;
...
Рейтинг: 0 / 0
10.09.2019, 15:41
    #39859909
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как соединить две таблицы (ORACLE)
Staxподзапросиком делал, мож пригодится для update (заполнить колонку D)
Опасная это тема, подзапросик в update.
Неофитов надо про where предупреждать, во избежание потери данных.
...
Рейтинг: 0 / 0
10.09.2019, 16:19
    #39859936
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как соединить две таблицы (ORACLE)
andrey_anonymousStaxподзапросиком делал, мож пригодится для update (заполнить колонку D)
Опасная это тема, подзапросик в update.
Неофитов надо про where предупреждать, во избежание потери данных.


ето скорее лаба, не реальная ж задача

тем более к постановке есть вопросы

напр a - 750, c - 754321, d должно попадать под замену?
если так то мое решение неполное (неверное)

зы
напр я б к where a<=c like добавил хотя б на первую букву и тд

.....
stax
...
Рейтинг: 0 / 0
10.09.2019, 16:59
    #39859961
chris0609
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как соединить две таблицы (ORACLE)
andrey_anonymous,
спасибо
...
Рейтинг: 0 / 0
10.09.2019, 17:01
    #39859963
chris0609
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как соединить две таблицы (ORACLE)
Stax, спасибо

select
t2.c
,(select max(b) KEEP (DENSE_RANK LAST ORDER BY length(t1.a))
from tab1 t1 where t2.c like t1.a||'%') d
from tab2 t2

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


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