如何使用TypeORM创建此ViewEntity?

时间:2019-12-22 21:21:10

标签: sql postgresql typeorm

假设我正在建立一个包含4个表的通讯录:usercontactfriendstranger

contact是连接userfriendstranger这两个表的链接表。它的结构如下:

╔════╦═════════╦═══════════╦═════════════╗
║ 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列获取用户所有联系人的列表 { {1}}和friend表。

理想情况下,我想使用TypeORM来实现这一点,但是仅知道正确的SQL也会有所帮助。

3 个答案:

答案 0 :(得分:2)

尝试定义一个ViewEntity,该表在contactsfriendsstranger表之间执行左连接。然后,结果行将映射到ContactWithName对象上,从而添加一个新字段contact_name,其中concats name和{ {1}}表({friends字段将被忽略)。

stranger

然后,您可以照常查询结果集:NULL

答案 1 :(得分:1)

我的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”函数使魔术;-)

答案 2 :(得分:0)

我不确定您的问题。您应该提供有关如何在维度表中存储数据的更多信息。我假设FriendsStranger表包含唯一的id和列名。我们了解到,您想使用来自ContactFriends的数据来充实事实表(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;

如果不能解决您的问题,请随时提供更多信息。