Я не уверен, что ваша структура таблицы и всегда объединение на party_key
работает ... но вот как использовать PIVOT
(сначала вы должны присвоить каждой организации идентификатор строки с помощью аналитики ROW_NUMBER
функция):
SQL Fiddle
Настройка схемы Oracle 11g R2 :
CREATE TABLE party ( key ) AS
SELECT 1 FROM DUAL;
CREATE TABLE person (party_key, name ) AS
SELECT 1, 'John' FROM DUAL UNION ALL
SELECT 1, 'Samantha' FROM DUAL;
CREATE TABLE organization ( party_key, name ) AS
SELECT 1, 'Whitehouse' FROM DUAL UNION ALL
SELECT 1, 'Library' FROM DUAL;
CREATE TABLE id ( party_key, id ) AS
SELECT 1, '0001' FROM DUAL UNION ALL
SELECT 1, '0002' FROM DUAL;
Запрос 1 :
SELECT *
FROM (
SELECT pers.name as person_name,
org.name as org_name,
id_pers.id as person_id,
id_org.id as org_id,
ROW_NUMBER() OVER (
PARTITION BY pers.name, org.name, id_pers.id
ORDER BY id_org.id
) AS rn
FROM party part
INNER JOIN person pers ON pers.party_key = part.key
INNER JOIN organization org ON org.party_key = part.key
INNER JOIN id id_pers ON pers.party_key = id_pers.party_key
INNER JOIN id id_org ON pers.party_key = id_org.party_key
)
PIVOT ( MAX( org_id ) FOR rn IN (
1 AS org_id1,
2 AS org_id2
) )
Результаты :
| PERSON_NAME | ORG_NAME | PERSON_ID | ORG_ID1 | ORG_ID2 |
|-------------|------------|-----------|---------|---------|
| John | Library | 0001 | 0001 | 0002 |
| John | Library | 0002 | 0001 | 0002 |
| John | Whitehouse | 0001 | 0001 | 0002 |
| John | Whitehouse | 0002 | 0001 | 0002 |
| Samantha | Library | 0001 | 0001 | 0002 |
| Samantha | Library | 0002 | 0001 | 0002 |
| Samantha | Whitehouse | 0001 | 0001 | 0002 |
| Samantha | Whitehouse | 0002 | 0001 | 0002 |