Конвертировать из таблицы EAV в SQL - PullRequest
0 голосов
/ 18 мая 2018

У меня проблемы с преобразованием в формат таблицы EAV во что-то полезное.Таблица ссылок сбивает меня с толку, и я не знаю, как начать это исправлять.У кого-нибудь есть предложения?

Таблица контактов

con_id Name Data
1      email a@gmail.com
2      phone 123
3      email b@gmail.com
4      phone 456

Таблица ссылок (сопоставляет действительные учетные записи пользователей со строками в таблице контактов):

acct_id con_id
1       1
1       2
2       3
2       4

КОНЕЦ ЦЕЛЬ:

acct_id Email       Phone
1       a@gmail.com 123
2       b@gmail.com 456

1 Ответ

0 голосов
/ 18 мая 2018

http://sqlfiddle.com/#!4/7cf20/5/0

CREATE TABLE Contacts
    (con_id int, Name varchar2(5), Data varchar2(11))
;

INSERT ALL 
    INTO Contacts (con_id, Name, Data)
         VALUES (1, 'email', 'a@gmail.com')
    INTO Contacts (con_id, Name, Data)
         VALUES (2, 'phone', '123')
    INTO Contacts (con_id, Name, Data)
         VALUES (3, 'email', 'b@gmail.com')
    INTO Contacts (con_id, Name, Data)
         VALUES (4, 'phone', '456')
SELECT * FROM dual
;

CREATE TABLE Link
    (acct_id int, con_id int)
;

INSERT ALL 
    INTO Link (acct_id, con_id)
         VALUES (1, 1)
    INTO Link (acct_id, con_id)
         VALUES (1, 2)
    INTO Link (acct_id, con_id)
         VALUES (2, 3)
    INTO Link (acct_id, con_id)
         VALUES (2, 4)
SELECT * FROM dual
;

Запрос -

select * from (
select acct_id, name, Data
from contacts c, Link l
where c.con_id = l.con_id
)
pivot (max(Data) for name in ('email' as Email,'phone' as Phone));

Вывод -

ACCT_ID EMAIL         PHONE
1       a@gmail.com   123
2       b@gmail.com   456
...