Обновление строки, согласно Rownum в Oracle - PullRequest
0 голосов
/ 06 февраля 2020

У меня есть две таблицы в Oracle

TableProducts

Product_Code, and 20 others fields
    BGU
    LSO
    MPA
    MPA4
    MPA5
    TPA
    UGU

Для этого примера теперь у меня есть 7 значений, но может быть 9 значений позже.

CREATE TABLE TableContacts AS SELECT * 
FROM Contacts 
WHERE Rownum <= (4*(SELECT Count(Distinct Product_Code) FROM TableProducts));

Теперь у меня есть 28 строк в моем TableContacts .

Теперь мне нужно обновить строки, чтобы создать тест комбинаций.

TableContacts

Product_Code, Email, PDF и еще 17 полей.

Email и PDF имеет два возможных значения 'N' или 'Y'.

Мне нужно заполнить TableContacts комбинациями полей Product_Code, Email и PDF, в соответствии с положением Rownum.

Rownum = 1 -> Product_Code='BGU', Email='N', PDF='N'

Rownum = 2 -> Product_Code='BGU', Email='N', PDF='Y'

Rownum = 3 -> Product_Code='BGU', Email='Y', PDF='N'

Rownum = 4 -> Product_Code='BGU', Email='Y', PDF='Y'

Rownum = 5 -> Product_Code='LSO', Email='N' , PDF='N'

Если у меня есть 7 значений для Product_Code, 2 для Email и 2 для PDF, тогда мне нужно будет заполнить (7 * 2 * 2) = 28 Ряды .

Как правильно te и SQL для этой ситуации обновление TableContacts ?

1 Ответ

0 голосов
/ 06 февраля 2020

Частично, требование не имеет смысла. Строки в таблице в реляционных базах данных никоим образом не сортируются, поэтому сказать, что вы хотите сослаться на 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>
...