2016-07-13 39 views
1

私はSQLを学び、1対多の関係で2つのテーブルのクエリを書く方法を理解しようとしています。Oracle SQLクエリ1つの行に複数行、複数行を選択

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') 

である私は、私は次の結果

を達成したいと思います

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

を取得し、私のクエリからテーブル

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 111-111-1112 111-111-1113 

ご協力いただきありがとうございます。

+0

あなただけの学習SQLを起動している場合は、私は強く、旋回のようないくつかの厄介な仕掛けで起動しないようにお勧めします。 ;-)しかし、それはできますが、以前はSQLで作業したことがない方が簡単です。 – Tyron78

+0

ピボットに関して、これは役立ちます。http://www.oracle.com/technetwork/articles/sql/11g-pivot-097235.html – Tyron78

答えて

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) 
関連する問題