2016-07-13 1 views
1

나는 SQL을 배우는 방법과 일대 다 관계에 두 테이블에 대한 쿼리를 작성하는 방법을 알아 내려고.오라클 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') 

는 내가

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

피벗 (pivoting)에 관해서는 다음을 참조하십시오. http://www.oracle.com/technetwork/articles/sql/11g-pivot-097235.html – Tyron78

답변

1

한 가지 방법은 ID가 전화 번호 분할의 CONCAT 컴퓨팅, 다음과 같을 수 있습니다

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)