Используйте аналитическую функцию ROW_NUMBER()
, чтобы присвоить каждому тегу в table2
инкрементный уникальный номер для каждого клиента, а затем PIVOT
вывод из строк в столбцы, а затем соединить его с table1
:
Установка Oracle :
CREATE TABLE table1 ( CUSTOMER_ID, FIRSTNAME, LASTNAME ) AS
SELECT 1, 'ALICE', 'MILLER' FROM DUAL UNION ALL
SELECT 2, 'BOB', 'SMITH' FROM DUAL;
CREATE TABLE table2 ( ID, CUSTOMER_ID, TAG ) AS
SELECT 1, 1, 'PRO-CUSTOMER' FROM DUAL UNION ALL
SELECT 2, 1, 'ADMIN' FROM DUAL UNION ALL
SELECT 3, 2, 'PRO CUSTOMER' FROM DUAL;
Запрос
SELECT t1.customer_id,
t1.firstname,
t1.lastname,
t2.tag1,
t2.tag2,
t2.tag3,
t2.tag4 -- increase until you reach your maximum number of tags.
FROM table1 t1
LEFT OUTER JOIN
(
SELECT *
FROM ( SELECT customer_id, tag,
ROW_NUMBER() OVER ( PARTITION BY customer_id ORDER BY tag, id ) AS rn
FROM table2 )
PIVOT ( MAX( tag ) FOR rn IN (
1 AS tag1,
2 AS tag2,
3 AS tag3,
4 AS tag4 -- increase until you reach your maximum number of tags.
)
) t2
ON ( t1.customer_id = t2.customer_id );
выход
CUSTOMER_ID | FIRSTNAME | LASTNAME | TAG1 | TAG2 | TAG3 | TAG4
----------: | :-------- | :------- | :----------- | :----------- | :--- | :---
1 | ALICE | MILLER | ADMIN | PRO-CUSTOMER | <em>null</em> | <em>null</em>
2 | BOB | SMITH | PRO CUSTOMER | <em>null</em> | <em>null</em> | <em>null</em>
дБ <> скрипка здесь