Частично, требование не имеет смысла. Строки в таблице в реляционных базах данных никоим образом не сортируются, поэтому сказать, что вы хотите сослаться на rownum, - это ... странно . Вот почему я изменил таблицу contacts
и добавил еще один столбец - rn
- который показывает, что rownum ваш.
Кроме того, в этом примере показаны только 3 продукта (не хочется набрать их все). Следующий код не заботится о количестве этих продуктов и будет работать одинаково независимо.
Продукты:
SQL> select * From products;
CODE
-----
BGU
LSO
MPA
Вставить в контакты:
SQL> insert into contacts (rn, code, email, pdf)
2 with temp as
3 (select p.code, x.lvl
4 from products p cross join (Select level lvl from dual connect by level <= 4) x
5 )
6 select t.lvl,
7 t.code,
8 case when t.lvl in (1, 2) then 'N'
9 when t.lvl in (3, 4) then 'Y'
10 end email,
11 --
12 case when t.lvl in (1, 3) then 'N'
13 when t.lvl in (2, 4) then 'Y'
14 end pdf
15 from temp t;
12 rows created.
Результат :
SQL> select * From contacts
2 order by code, rn;
RN CODE E P
---------- ----- - -
1 BGU N N
2 BGU N Y
3 BGU Y N
4 BGU Y Y
1 LSO N N
2 LSO N Y
3 LSO Y N
4 LSO Y Y
1 MPA N N
2 MPA N Y
3 MPA Y N
4 MPA Y Y
12 rows selected.
SQL>
[ПРАВИТЬ: как обновить таблицу, содержащую строки?]
Если я правильно вас понял, это то, что вы изначально имеете в таблица CONTACTS
:
SQL> select code, rownum from contacts;
CODE ROWNUM
----- ----------
BGU 1
LSO 2
MPA 3
BGU 4
LSO 5
MPA 6
BGU 7
LSO 8
MPA 9
BGU 10
LSO 11
MPA 12
12 rows selected.
SQL>
Как я уже говорил, rownum здесь не имеет значения, он может измениться, вы не можете сказать, к какому rownum
принадлежит code
.
В любом случае, такой update
(merge
, на самом деле) выполняет свою работу:
SQL> merge into contacts a
2 using (select c.code,
3 c.rowid,
4 row_number() over (partition by c.code order by null) rn
5 from contacts c
6 ) x
7 on (a.rowid = x.rowid)
8 when matched then update set
9 a.email = case when x.rn in (1, 2) then 'N'
10 when x.rn in (3, 4) then 'Y'
11 end,
12 a.pdf = case when x.rn in (1, 3) then 'N'
13 when x.rn in (2, 4) then 'Y'
14 end;
12 rows merged.
SQL> select * From contacts order by code, email, pdf;
CODE EMAIL PDF
----- ----- -----
BGU N N
BGU N Y
BGU Y N
BGU Y Y
LSO N N
LSO N Y
LSO Y N
LSO Y Y
MPA N N
MPA N Y
MPA Y N
MPA Y Y
12 rows selected.
SQL>