Oracle Multiple update Query - PullRequest
       3

Oracle Multiple update Query

0 голосов
/ 22 июня 2010

У меня есть две таблицы, подобные приведенной ниже, в моей БД. В первой таблице ITEM для каждого DEPARTMENT_CODE будет несколько ITEM_CODE.

ITEM
----------------------------------------------------
"STORE_CODE" "ITEM_CODE" "DEPARTMENT_CODE"
"011"         "912003" "14"
"011"         "912004" "14"
"011"         "914001" "14"
----------------------------------------------------

COMPETITOR
--------------------------------------------------------------
"STORE_CODE"  "ITEM_CODE" "DEPARTMENT_CODE" "COMPETITOR_CODE"

"011"     "912003"     "14"       "01"
"011"     "912003"     "14"       "02"
"011"     "912003"     "14"       "03"
"011"     "912004"     "14"       "01"
"011"     "912004"     "14"       "02"
"011"     "912004"     "14"       "04"
"011"     "914001"     "14"       "01"
"011"     "914001"     "14"       "02"
"011"     "914001"     "14"       "03"
-------------------------------------------------------------

В таблице COMPETITOR evey ITEMCODE будет иметь три записи, и для этого будет использоваться разные Competitor_Code

У меня есть три значения Comp_1, comp_2, comp_3 и Department_code = 14;

то, что я хочу сделать, это обновить таблицу COMPETITOR с comp_1, comp_2, comp_3 для каждого элемента Item_code, в котором для кода отдела = 14 в таблице ITEM

пример вывода

COMPETITOR
--------------------------------------------------------------
"STORE_CODE"  "ITEM_CODE" "DEPARTMENT_CODE" "COMPETITOR_CODE"

"011"     "912003"     "14"       "Comp_1"
"011"     "912003"     "14"       "Comp_2"
"011"     "912003"     "14"       "Comp_3"
"011"     "912004"     "14"       "Comp_1"
"011"     "912004"     "14"       "Comp_2"
"011"     "912004"     "14"       "Comp_3"
"011"     "914001"     "14"       "Comp_1"
"011"     "914001"     "14"       "Comp_2"
"011"     "914001"     "14"       "Comp_3"
-------------------------------------------------------------

Как я могу написать один запрос оракула для этого ??

1 Ответ

2 голосов
/ 22 июня 2010

Ниже предполагается, что ITEM_CODE назначен только одному DEPARTMENT_CODE, потому что это просто, и вы не дали нам никаких дальнейших бизнес-правил.Если это предположение неверно, вам необходимо соответствующим образом скорректировать логику.

Я также включил ваше требование о ненадежности существующего значения COMPETITOT.COMPETITOR_CODE.

Учитывая эту дату теста:

SQL> select * from competitor
  2  /

STORE_CODE  ITEM_CODE DEPARTMENT_CODE COMPETITOR
---------- ---------- --------------- ----------
        11     912003              14 01
        11     912003              14 04
        11     912003              14 03
        11     912004              14 01
        11     912004              14 02
        11     912004              14 04
        11     914001              14 01
        11     914001              14 02
        11     914001              14 05

9 rows selected.

SQL>

Мы можем использовать аналитическую функцию ROW_NUMBER (), чтобы сгенерировать необходимый дескриптор для COMPETITOR_CODE:

SQL> update competitor c
  2  set competitor_code =
  3          (select decode (dr
  4                         , 1, 'Comp_1'
  5                         , 2, 'Comp_2'
  6                         , 3, 'Comp_3')
  7             from ( select row_number() over ( partition by x.item_code
  8                                                  order by x.rowid ) as dr
  9                           , x.rowid as row_id
 10                    from competitor x
 11                    where x.item_code in ( select item_code
 12                                           from item
 13                                           where  department_code = 14 ) ) l
 14             where c.rowid = l.rowid )
 15  /

9 rows updated.

SQL>

И это желаемый результат (исключая любые дальнейшие добавления в бизнес-правила):

SQL> select * from competitor
  2  /

STORE_CODE  ITEM_CODE DEPARTMENT_CODE COMPETITOR
---------- ---------- --------------- ----------
        11     912003              14 Comp_1
        11     912003              14 Comp_2
        11     912003              14 Comp_3
        11     912004              14 Comp_1
        11     912004              14 Comp_2
        11     912004              14 Comp_3
        11     914001              14 Comp_1
        11     914001              14 Comp_2
        11     914001              14 Comp_3

9 rows selected.

SQL>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...