Oracle连接查询

And*_*eda 2 sql database oracle join

我的db 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 
Run Code Online (Sandbox Code Playgroud)

我想在单个查询中获取所有这些ITEM_CODE

  STORE_CODE ITEM_CODE ITEM_DESC COMP_DESC1 COMP_DESC2 COMP_DESC3 COMP_DESC4
     011       914004     desccc   comp1      comp2       comp3      comp4
Run Code Online (Sandbox Code Playgroud)

我怎么能为此编写一个oracle SQL查询?

Rob*_*ijk 7

获取此输出涉及两个步骤:连接和枢轴.

一个例子:

首先创建样本表:

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.
Run Code Online (Sandbox Code Playgroud)

第一步是加入.这里我使用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.
Run Code Online (Sandbox Code Playgroud)

comp描述显示在彼此之下,但您希望它们彼此相邻.为此,您可以旋转结果集.请注意,您必须硬编码要转动的行数:

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.
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.

问候,Rob.