假设我正在建立一个包含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
列获取用户所有联系人的列表 { {1}}和friend
表。
理想情况下,我想使用TypeORM来实现这一点,但是仅知道正确的SQL也会有所帮助。
答案 0 :(得分:2)
尝试定义一个ViewEntity,该表在contacts
,friends
和stranger
表之间执行左连接。然后,结果行将映射到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)
我不确定您的问题。您应该提供有关如何在维度表中存储数据的更多信息。我假设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;
如果不能解决您的问题,请随时提供更多信息。