Oracle присоединиться к запросу - PullRequest
1 голос
/ 17 июня 2010

В моей базе данных есть три таблицы ITEM_MASTER, PRICE_MASTER, COMP_MASTER

ITEM_MASTER
STORE_CODE  ITEM_CODE  ITEM_DESC
   011         914004   desccc

PRICE_MASTER
STORE_CODE  ITEM_CODE  COMP_CODE
   011         914004     01 
   011         914004     02
   011         914004     03
   011         914004     04

COMP_MASTER
COMP_CODE   COMP_DESC   STORE_CODE
   01        comp1         011
   02        comp2         011
   03        comp3         011
   04        comp4         011 

Я хочу получить все это для ITEM_CODE в одном запросе

  STORE_CODE ITEM_CODE ITEM_DESC COMP_DESC1 COMP_DESC2 COMP_DESC3 COMP_DESC4
     011       914004     desccc   comp1      comp2       comp3      comp4

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

1 Ответ

6 голосов
/ 17 июня 2010

Чтобы получить эти выходные данные, необходимо выполнить два шага: объединение и сводную точку.

Пример:

Сначала создайте образцы таблиц:

SQL> create table item_master (store_code,item_code,item_desc)
  2  as
  3  select '011', 914004, 'desccc' from dual
  4  /

Table created.

SQL> create table price_master (store_code,item_code,comp_code)
  2  as
  3  select '011', 914004, '01' from dual union all
  4  select '011', 914004, '02' from dual union all
  5  select '011', 914004, '03' from dual union all
  6  select '011', 914004, '04' from dual
  7  /

Table created.

SQL> create table comp_master (comp_code,comp_desc,store_code)
  2  as
  3  select '01', 'comp1', '011' from dual union all
  4  select '02', 'comp2', '011' from dual union all
  5  select '03', 'comp3', '011' from dual union all
  6  select '04', 'comp4', '011' from dual
  7  /

Table created.

Первый шаг - соединение. Здесь я использую синтаксис соединения ANSI, но вы также можете использовать старый добрый синтаксис соединения Oracle.

SQL> select i.store_code
  2       , i.item_code
  3       , i.item_desc
  4       , c.comp_desc
  5    from item_master i
  6         inner join price_master p
  7         on (   i.store_code = p.store_code
  8            and i.item_code = p.item_code
  9            )
 10         inner join comp_master c
 11         on (   p.store_code = c.store_code
 12            and p.comp_code = c.comp_code
 13            )
 14  /

STO  ITEM_CODE ITEM_D COMP_
--- ---------- ------ -----
011     914004 desccc comp1
011     914004 desccc comp2
011     914004 desccc comp3
011     914004 desccc comp4

4 rows selected.

Описание компа появляется под друг другом, но вы хотите, чтобы они были рядом друг с другом. Чтобы добиться этого, вы поворачиваете набор результатов. Обратите внимание, что вам нужно жестко указать количество строк, которые вы хотите изменить:

SQL> with t as
  2  ( select i.store_code
  3         , i.item_code
  4         , i.item_desc
  5         , c.comp_desc
  6         , row_number() over (partition by i.store_code,i.item_code order by c.comp_code) rn
  7      from item_master i
  8           inner join price_master p
  9           on (   i.store_code = p.store_code
 10              and i.item_code = p.item_code
 11              )
 12           inner join comp_master c
 13           on (   p.store_code = c.store_code
 14              and p.comp_code = c.comp_code
 15              )
 16  )
 17  select store_code
 18       , item_code
 19       , item_desc
 20       , max(decode(rn,1,comp_desc)) comp_desc1
 21       , max(decode(rn,2,comp_desc)) comp_desc2
 22       , max(decode(rn,3,comp_desc)) comp_desc3
 23       , max(decode(rn,4,comp_desc)) comp_desc4
 24    from t
 25   group by store_code
 26       , item_code
 27       , item_desc
 28  /

STO  ITEM_CODE ITEM_D COMP_ COMP_ COMP_ COMP_
--- ---------- ------ ----- ----- ----- -----
011     914004 desccc comp1 comp2 comp3 comp4

1 row selected.

Надеюсь, это поможет.

С уважением, Роб.

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