Как создать этот ViewEntity с TypeORM? - PullRequest
2 голосов
/ 23 декабря 2019

Допустим, я создаю адресную книгу, в которой есть 4 таблицы: user, contact, friend и stranger.

contact - это таблица связей, соединяющая userс ОБА * таблицы friend и stranger. Он структурирован как:

╔════╦═════════╦═══════════╦═════════════╗
║ id ║ user_id ║ friend_id ║ stranger_id ║
╠════╬═════════╬═══════════╬═════════════╣
║ 1  ║ 1       ║ 5         ║ NULL        ║
╠════╬═════════╬═══════════╬═════════════╣
║ 2  ║ 1       ║ NULL      ║ 65          ║
╠════╬═════════╬═══════════╬═════════════╣
║ 3  ║ 1       ║ 87        ║ NULL        ║
╚════╩═════════╩═══════════╩═════════════╝

Я хотел бы создать представление, которое выглядит следующим образом:

╔════╦═════════╦═══════════╦═════════════╦══════════════╗
║ id ║ user_id ║ friend_id ║ stranger_id ║ contact_name ║
╠════╬═════════╬═══════════╬═════════════╬══════════════╣
║ 1  ║ 1       ║ 5         ║ NULL        ║ Barry        ║
╠════╬═════════╬═══════════╬═════════════╬══════════════╣
║ 2  ║ 1       ║ NULL      ║ 65          ║ Gary         ║
╠════╬═════════╬═══════════╬═════════════╬══════════════╣
║ 3  ║ 1       ║ 87        ║ NULL        ║ Larry        ║
╚════╩═════════╩═══════════╩═════════════╩══════════════╝

То есть мне нужно представление, которое я могу запросить, используя user_idи получить список всех контактов этого пользователя с столбцом name, общим для таблиц friend и stranger.

В идеале, я хотел бы реализовать это, используяTypeORM, но просто знание правильного SQL для него также поможет.

Ответы [ 2 ]

0 голосов
/ 04 января 2020

Моя версия SQL для вашего просмотра:

CREATE VIEW myview AS
SELECT co.id, co.user_id, co.friend_id,
       co.stranger_id, concat(f.name, s.name) AS contact_name
FROM contact co
LEFT JOIN friend f ON (co.friend_id = f.friend_id)
LEFT JOIN stranger s ON (co.stranger_id = s.stranger_id);

Функция "concat" делает магию; -)

0 голосов
/ 04 января 2020

Я не уверен в вашем вопросе. Вы должны предоставить больше информации о том, как ваши данные хранятся в таблицах измерений. Я предполагаю, что таблицы Friends и Stranger содержат уникальное id и имя столбца. Я понимаю, что вы хотели бы дополнить свою таблицу фактов (Contact) данными из Friends и Stranger, указав имена в одном столбце. Если это предположение верно, то, возможно, этот запрос может сделать это:

select c.id, c.user_id, c.friend_id, c.stranger_id, f.friend_name as contact_name
from #contact c
inner join #friend f
on c.friend_id = f.id
union
select c.id, c.user_id, c.friend_id, c.stranger_id, s.stranger_name as contact_name
from #contact c
inner join #stranger s
on c.stranger_id = s.id;

Не стесняйтесь предоставить дополнительную информацию, если это не решит вашу проблему.

...