Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Есть задачка ...  [new]
UncleFox
Member

Откуда:
Сообщений: 56
Добрый день!
Возникла такая задача, может она и не сложная, но с какого краю подойти не понятно. Средствами SQL (без использования PL) написать SELECT выполняющий замену данных в одной таблице по данным в другой.

Есть таблица данных 1 с записями:
------------------
ВАся
петя
БоБ
Есть таблица замены 2 с записями:
------------------
А Г
Б Д
В Е
Результат работы SELECT:
------------------
ЕГся
петя
ДоД

Возможно ли такое?
12 авг 10, 15:14    [9254282]     Ответить | Цитировать Сообщить модератору
 Re: Есть задачка ...  [new]
-2-
Member

Откуда:
Сообщений: 15330
UncleFox
написать SELECT выполняющий замену данных в одной таблице по данным в другой.
...
Возможно ли такое?
Нет. UPDATE.
12 авг 10, 15:19    [9254328]     Ответить | Цитировать Сообщить модератору
 Re: Есть задачка ...  [new]
UncleFox
Member

Откуда:
Сообщений: 56
-2-,

Я имел замену данных в выборке SELECTа...а не таблице
12 авг 10, 15:21    [9254351]     Ответить | Цитировать Сообщить модератору
 Re: Есть задачка ...  [new]
mblsha
Member

Откуда:
Сообщений: 89
CASE?
12 авг 10, 15:22    [9254362]     Ответить | Цитировать Сообщить модератору
 Re: Есть задачка ...  [new]
UncleFox
Member

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

А можно примерчик, как его приложить к данной задаче?
12 авг 10, 15:29    [9254442]     Ответить | Цитировать Сообщить модератору
 Re: Есть задачка ...  [new]
-2-
Member

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

Циклы допускаются?
12 авг 10, 15:31    [9254467]     Ответить | Цитировать Сообщить модератору
 Re: Есть задачка ...  [new]
UncleFox
Member

Откуда:
Сообщений: 56
-2-,

В SELECT - нет.
12 авг 10, 15:33    [9254489]     Ответить | Цитировать Сообщить модератору
 Re: Есть задачка ...  [new]
Eras
Member

Откуда: Вильнюс
Сообщений: 123
мож так ?
with tbl1 as(select 'ВАся' txt1 from dual
             union all
             select 'петя' txt1 from dual
             union all
             select 'БоБ' txt1 from dual),
     tbl2 as (select 'А' in_chr, 'Г' out_chr from dual
              union all
              select 'Б' in_chr, 'Д' out_chr from dual
              union all
              select 'В' in_chr, 'Е' out_chr from dual)
select txt1,
       translate(txt1, in_chr, out_chr) txt1_translated
from tbl1,       
     (select in_chr,
             out_chr
      from (select regexp_replace(sys_connect_by_path(in_chr, ','), ',', '') in_chr,
                   regexp_replace(sys_connect_by_path(out_chr, ','), ',', '') out_chr
            from (select in_chr,
                         out_chr, 
                         row_number() over (order by in_chr, out_chr) as id,
                         row_number() over (order by in_chr, out_chr) - 1 as prev_id
                  from tbl2)
            start with prev_id = 0
            connect by prev_id = prior id
            order by level desc)
      where rownum = 1)
12 авг 10, 15:35    [9254525]     Ответить | Цитировать Сообщить модератору
 Re: Есть задачка ...  [new]
Серафимный Шестикрыл
Member [заблокирован]

Откуда: С луны свалился
Сообщений: 2922
UncleFox
mblsha,

А можно примерчик, как его приложить к данной задаче?


translate например (в данном конкретном случае пары не должны содержать NULL
для нового значения)

SQL> with t as (select 'VAsya' x from dual
  2  union all
  3  select 'petya' from dual
  4  union all select 'BoB' from dual)
  5  ,
  6  y as (
  7  select 'A' i, 'B' n from dual
  8  union all select 'B','D' from dual
  9  union all select 'V','G' from dual
 10  )
 11  select translate(t.x,trn.orig, trn.new), t.x from
 12  (
 13  select max(replace(substr(sys_connect_by_path(i,'/'),2),'/',null)) orig, 
 14  max(replace(substr(sys_connect_by_path(n,'/'),2),'/',null)) new from 
 15  (select rownum rn, i, n from y)
 16  start with rn=1
 17  connect by prior rn = rn-1
 18  ) trn, t
 19  /

TRANS X
----- -----
GBsya VAsya
petya petya
DoD   BoB
12 авг 10, 15:39    [9254586]     Ответить | Цитировать Сообщить модератору
 Re: Есть задачка ...  [new]
-2-
Member

Откуда:
Сообщений: 15330
-2-
Циклы допускаются?
UncleFox
В SELECT - нет.
Вы не поняли вопроса. Циклы в таблице замен.
12 авг 10, 15:50    [9254717]     Ответить | Цитировать Сообщить модератору
 Re: Есть задачка ...  [new]
?
Guest
select replace(t1.s, n, t2.s) from 
(select row_number() over(order by 1) as nn, t1.* from  t1) t1 join
(select row_number() over(order by 1) as nn2, t2.* from  t2) t2
on t1.nn=t2.nn2
12 авг 10, 16:02    [9254872]     Ответить | Цитировать Сообщить модератору
 Re: Есть задачка ...  [new]
parkan4k
Member

Откуда:
Сообщений: 32
Не хотелось ворошить прошлое, но...
with t as(
select 'А'i, 'Г'j from dual
union all
select 'Б','Д' from dual
union all
select 'В','Е' from dual
)
,t2 as(
select 'ВАся' n from dual
union all
select 'петя' from dual
union all
select 'БоБ' from dual
)

select translate(n,a,b) from t2,
(select extract(xmlagg(xmlelement("a",i)),'a/text()').getStringVal() a,extract(xmlagg(xmlelement("a",j)),'a/text()').getStringVal()b from t)a
13 апр 11, 15:59    [10513418]     Ответить | Цитировать Сообщить модератору
 Re: Есть задачка ...  [new]
AlexFF__|
Member

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

Подскажи, как вы эти темы откапываете?
Типа, если есть ответ, надо найти под него вопрос?
13 апр 11, 16:07    [10513488]     Ответить | Цитировать Сообщить модератору
 Re: Есть задачка ...  [new]
parkan4k
Member

Откуда:
Сообщений: 32
select 'https://www.sql.ru/forum/actualtopics.aspx?bid=3&&p='||abs(mod(dbms_random.random,1701)+1) from dual
13 апр 11, 16:49    [10513835]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Есть задачка ...  [new]
unknown _user
Guest
А можно ли заставить приведённые выше алгоритмы работать с целыми словами?
Например:
with t as(
select 'ВАся' i, 'Василий' j from dual
union all
select 'петя', 'Пётр' from dual
union all
select 'БоБ', 'Боб' from dual
)
,t2 as(
select 'ВАся' n from dual
union all
select 'петя' from dual
union all
select 'БоБ' from dual
)
12 май 15, 11:04    [17627640]     Ответить | Цитировать Сообщить модератору
 Re: Есть задачка ...  [new]
Добрый Э - Эх
Guest
unknown _user,

так вроде у тебя всё сводится к банальному джойну по равенству...
12 май 15, 11:12    [17627679]     Ответить | Цитировать Сообщить модератору
 Re: Есть задачка ...  [new]
unknown_user1
Guest
Чистое объединение не совсем подойдёт (беру пример из темы выше), т.к. если несколько совпадений не отработает (строка 2).

--Меняет только в первой строке на первую замену
with tbl1 as(select 'кепрекр ВАся пркеаркепркер' txt1 from dual
             union all
             select 'ваепыуепк петя укепккеп БоБ' txt1 from dual
             union all
             select 'БоБ__вапакпавпа' txt1 from dual),
     tbl2 as (select 'ВАся' in_chr, 'Василий' out_chr from dual
              union all
              select 'петя' in_chr, 'Пётр' out_chr from dual
              union all
              select 'БоБ' in_chr, 'Бобчик' out_chr from dual)
select replace(tbl1.txt1, in_chr, tbl2.out_chr) from 
    (select row_number() over(order by 1) as nn, tbl1.* from  tbl1) tbl1 join
    (select row_number() over(order by 1) as nn2, tbl2.* from  tbl2) tbl2
on tbl1.nn=tbl2.nn2
12 май 15, 12:01    [17627980]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить