【问题标题】:Oracle SQL query select one to many, mult row into one row resultOracle SQL查询选择一对多,多行成一行结果
【发布时间】:2016-07-13 13:07:52
【问题描述】:

我正在学习 sql 并试图弄清楚如何以一对多的关系编写两个表的查询。

Table1 有人员信息: (PersonId, FirstName, MiddleName, LastName)table2(PersonId, Phone, PhoneType)

这是我目前的查询

select Table1.PERSON_ID, 
Table1.FIRST_NAME, 
Table1.MIDDLE_NAME, 
Table1.LAST_NAME, 
Table2.PHONE_NUMBER
from Table1
inner join Table2
on Table2.PERSON_ID = Table1.PERSON_ID
where Table2.PHONE_TYPE in ('BUSINESS','PERSONAL','HOME')

这是一张桌子

Table1
PERSON_ID     FIRST_NAME     MIDDLE_NAME     LAST_NAME
1             John           Carter          Jones

Table2
PERSON_ID     PHONE_NUMBER   PHONE_TYPE
1             111-111-1111   HOME
1             111-111-1112   PERSONAL
1             111-111-1113   BUSINESS

从我的查询中我得到

1     John Carter Jones 111-111-1111
1     John Carter Jones 111-111-1112
1     John Carter Jones 111-111-1113

我想达到以下结果

1     John Carter Jones 111-111-1111 111-111-1112 111-111-1113

非常感谢任何帮助。

【问题讨论】:

  • 如果你刚开始学习 SQL,我强烈建议不要从一些讨厌的噱头开始,比如旋转。 ;-) 但是,这是可以做到的,但是如果您以前从未使用过 SQL,这并不容易。
  • 关于旋转,这可能会有所帮助:oracle.com/technetwork/articles/sql/11g-pivot-097235.html

标签: sql oracle


【解决方案1】:

一种方法可能如下,计算按 ID 分区的电话号码的连接:

with Table1(PERSON_ID, FIRST_NAME, MIDDLE_NAME, LAST_NAME) as
(
  select 1, 'John', 'Carter', 'Jones' from dual union all
  select 2, 'James', '', 'Smith' from dual 
),
Table2(PERSON_ID, PHONE_NUMBER, PHONE_TYPE) as
(
  select 1,'111-111-1111',   'HOME' from dual union all
  select 1,'111-111-1112',   'PERSONAL' from dual union all
  select 1,'111-111-1113',   'BUSINESS' from dual union all
  select 2,'222-222-2221',   'BUSINESS' from dual union all
  select 2,'222-222-2223',   'BUSINESS' from dual 
)
select distinct listagg(PHONE_NUMBER, ', ') within group (order by phone_number) over (partition by person_id), PERSON_ID, FIRST_NAME, MIDDLE_NAME, LAST_NAME
from table1 
  inner join table2
   using(person_id)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-17
    • 1970-01-01
    • 2018-10-12
    • 1970-01-01
    相关资源
    最近更新 更多