2016-07-13 3 views
1

Ich lerne SQL und versuchen herauszufinden, wie Sie die Abfrage für zwei Tabelle in einer Eins-zu-viele-Beziehung schreiben.Oracle SQL-Abfrage wählen Sie eins zu viele, mehr Zeilen in eine Zeile Ergebnis

Table1 hat die Person Informationen: (PersonId, FirstName, MiddleName, LastName) und table2 hat (PersonId, Phone, PhoneType).

Hier ist meine Abfrage bisher

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

hier ein Tabellen

ist
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 

Aus meiner Anfrage I

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

Ich möchte erreichen das folgende Ergebnis

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

Jede Hilfe wird sehr geschätzt.

+0

Wenn Sie gerade erst anfangen SQL lernen, würde ich stark mit einigen fiesen Gimmicks wie Schwenken beginnen nicht den Eindruck erwecken. ;-) Aber es kann gemacht werden, aber es ist nicht so einfach, wenn du vorher nie mit SQL gearbeitet hast. – Tyron78

+0

In Bezug auf Pivoting könnte dies helfen: http://www.oracle.com/technetwork/articles/sql/11g-pivot-097235.html – Tyron78

Antwort

1

Eine Möglichkeit könnte die folgende sein, die Berechnung der concat von Telefonnummern Partitionierung von 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)