Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 update через один  [new]
cba
Guest
есть таблица с ПК 1,2,3,4,5,6,7.... вообщем подряд от 1 и до ....
какое условие нужно написать update чтобы изменять 1 3 5 7 и т.д. строки
17 мар 07, 02:17    [3910095]     Ответить | Цитировать Сообщить модератору
 Re: update через один  [new]
Vladimir Sitnikov
Member

Откуда: Moscow, NetCracker
Сообщений: 407
cba
есть таблица с ПК 1,2,3,4,5,6,7.... вообщем подряд от 1 и до ....
какое условие нужно написать update чтобы изменять 1 3 5 7 и т.д. строки

where mod(ПК, 2)=1
?
17 мар 07, 02:23    [3910097]     Ответить | Цитировать Сообщить модератору
 Re: update через один  [new]
cba
Guest
ага, спасибо

можно ли одинм UPDATE сдеалть следующее

начиная со стороки следующей за ID = n изменть все значения на предыдущие до тех пор пока не встретиться ПОСЛЕДНИЙ NULL, этот NULL будет послденее что мы заменим
например
1 Ivanov
2
3 Sidorov
4
5 Petrov
6
7 Vasechkin

а получилось

1 Ivanov
2
3
4 Sidorov
5
6 Petrov
7 Vasechkin
17 мар 07, 03:14    [3910106]     Ответить | Цитировать Сообщить модератору
 Re: update через один  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18351
SQL> select * from ane_tst;

        ID NAME
---------- ---------
         1 Ivanov
         2 
         3 Sidorov
         4 
         5 Petrov
         6 
         7 Vasechkin

7 rows selected

SQL> merge into ane_tst dst
  2  using( select id, name, name2
  3         from(
  4         select id, name
  5              , lag(name,1,name) over(order by id) name2
  6              , sum(nvl2(name,to_number(null),1)) over(order by id desc) s_c
  7         from ane_tst t
  8         where id > 1 -- low bound
  9         ) where s_c >=1
 10  ) src
 11  on (dst.id=src.id)
 12  when matched then update set dst.name=src.name2
 13  when not matched then insert values(-src.id,src.name2);

Done

SQL> select * from ane_tst;

        ID NAME
---------- ---------
         1 Ivanov
         2 
         3 
         4 Sidorov
         5 
         6 Petrov
         7 Vasechkin

7 rows selected

SQL> 
17 мар 07, 09:52    [3910220]     Ответить | Цитировать Сообщить модератору
 Re: update через один  [new]
Elic
Member

Откуда:
Сообщений: 29980
cba
начиная со стороки следующей за ID = n изменть все значения на предыдущие до тех пор пока не встретиться ПОСЛЕДНИЙ NULL, этот NULL будет послденее что мы заменим
9i> create table tmp(id, name) as
9i>   select level, decode(level, 1,'Ivanov', 3,'Sidorov', 5,'Petrov', 7,'Vasechkin')
9i>   from dual
9i>   connect by level <= 7;

Table created.

9i> 
9i> select * from tmp order by id;

       ID NAME
--------- ---------
        1 Ivanov
        2
        3 Sidorov
        4
        5 Petrov
        6
        7 Vasechkin

7 rows selected.

9i> 
9i> var n number
9i> exec :n := 2

PL/SQL procedure successfully completed.

9i> 
9i> -- :-)))
9i> update tmp set id = decode(id, (select max(id) from tmp where name is null), :n, id + 1)
9i>   where id between :n and (select max(id) from tmp where name is null)
9i> ;

5 rows updated.

9i> select * from tmp order by id;

       ID NAME
--------- ---------
        1 Ivanov
        2
        3
        4 Sidorov
        5
        6 Petrov
        7 Vasechkin

7 rows selected.

9i> 
9i> rollback;

Rollback complete.

9i> 
9i> merge into tmp t1
9i>   using ( select decode(id, max(id) over (), min(id) over (), lead(id) over (order by id)) as id, name
9i>             from tmp
9i>             where id between :n and (select max(id) from tmp where name is null)
9i>         ) t2
9i>   on (t1.id = t2.id)
9i>   when matched then update set t1.name = t2.name
9i>   when not matched then insert (id) values (null)
9i> ;

5 rows merged.

9i> select * from tmp order by id;

       ID NAME
--------- ---------
        1 Ivanov
        2
        3
        4 Sidorov
        5
        6 Petrov
        7 Vasechkin

7 rows selected.
17 мар 07, 10:17    [3910247]     Ответить | Цитировать Сообщить модератору
 Re: update через один  [new]
Elic
Member

Откуда:
Сообщений: 29980
Elic
  using ( select decode(id, max(id) over (), min(id) over (), lead(id) over (order by id)) as id, name
  using ( select id, lag(name) over (order by id) as name
17 мар 07, 10:22    [3910253]     Ответить | Цитировать Сообщить модератору
 Re: update через один  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18351
Elic
Elic
  using ( select decode(id, max(id) over (), min(id) over (), lead(id) over (order by id)) as id, name
  using ( select id, lag(name) over (order by id) as name

Не факт, что целевая выборка начинается с NULL.
А в условии сказано только про "замену", про установку первого элемента в NULL ничего не сказано.
17 мар 07, 10:26    [3910260]     Ответить | Цитировать Сообщить модератору
 Re: update через один  [new]
Elic
Member

Откуда:
Сообщений: 29980
andrey_anonymous
Не факт, что целевая выборка начинается с NULL.
А нам это обсолютно безразлично.
andrey_anonymous
А в условии сказано только про "замену", про установку первого элемента в NULL ничего не сказано.
Так откуда же тогда в первой изменённой взялся NULL?!!!
Там четко сказано про замену на предыдущее

P.S. Пока что твоя аргументация не стоит сигары во рту :)
17 мар 07, 10:44    [3910280]     Ответить | Цитировать Сообщить модератору
 Re: update через один  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18351
Elic
Так откуда же тогда в первой изменённой взялся NULL?!!!
Там четко сказано про замену на предыдущее

Оно там ОСТАЛОСЬ.
Был бы Elic - остался бы Elic.
17 мар 07, 10:46    [3910285]     Ответить | Цитировать Сообщить модератору
 Re: update через один  [new]
Elic
Member

Откуда:
Сообщений: 29980
andrey_anonymous
Elic
Так откуда же тогда в первой изменённой взялся NULL?!!!
Там четко сказано про замену на предыдущее
Оно там ОСТАЛОСЬ.
Был бы Elic - остался бы Elic.
Понял :) Тогда lag(name, 1, name)
17 мар 07, 11:03    [3910302]     Ответить | Цитировать Сообщить модератору
 Re: update через один  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18351
Elic
Понял :) Тогда lag(name, 1, name)

Отож :)
17 мар 07, 11:09    [3910307]     Ответить | Цитировать Сообщить модератору
 Re: update через один  [new]
cba
Guest
спасибо
а как можно то же саоме только с pl/sql таблицей заполненной также

type bm_type is table of number index by binary_integer;
bm bm_type;
19 мар 07, 11:35    [3913855]     Ответить | Цитировать Сообщить модератору
 Re: update через один  [new]
Elic
Member

Откуда:
Сообщений: 29980
cba
а как можно то же саоме только с pl/sql таблицей заполненной также
В цикле.
19 мар 07, 11:52    [3913962]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить