问题描述
我想在多个表上创建联接。 表登录:我想从登录中检索所有数据 表记录:按用户为每个数据库和每个特定事件类型计算Nb_of_sessions 表会议:为每个数据库和每个用户计算Nb_of_meetings table live:为每个数据库和每个用户计算Nb_of_live
我的查询结果正确:
SELECT db.id,_id as userid,firstname,lastname
FROM "logins"."login",UNnesT(dbs) AS a1 (db)
SELECT dbid,userid,count(distinct(sessionid)) as no_of_visits,array_join(array_agg(value.from_url),',') as from_url
FROM "loggings"."logging"
where event='url_event'
group by db.id,userid;
SELECT dbid,userid AS userid,count(*) as nb_interviews,array_join(array_agg(interviewer),') as interviewer
FROM "meetings"."meeting"
group by dbid,r1.user._id AS userid,count(_id) as nb_chat
FROM "lives"."live",UNnesT(users) AS r1 (user)
group by dbid,r1.user._id;
但是当我开始尝试将它们放在一起时,似乎我检索了不良数据(我只检索了数据库),而且效率似乎不高。
select a1.db.id,a._id as userid,a.firstname,a.lastname,count(rl._id) as nb_chat
FROM
"logins"."login" a,"loggings"."logging" b,"meetings"."meeting" c,"lives"."live" d,UNnesT(dbs) AS a1 (db),UNnesT(users) AS r1 (user)
where a._id = b.userid AND a._id = c.userid AND a._id = r1.user._id
group by 1,2,3,4
你有个主意吗?
致谢。
解决方法
最简单的方法是使用with
来构造子查询,然后对其进行引用。
您可以使用WITH来平整嵌套查询或简化子查询。
WITH子句在查询中的SELECT列表之前,并定义一个或 更多子查询供SELECT查询中使用。
每个子查询定义一个临时表,类似于视图定义, 您可以在FROM子句中引用。这些表仅用于 查询运行时。
由于您已经具有有效的子查询,因此以下各项应该起作用:
with logins as
(
SELECT db.id,_id as userid,firstname,lastname
FROM "logins"."login",UNNEST(dbs) AS a1 (db)
),visits as
(
SELECT dbid,userid,count(distinct(sessionid)) as no_of_visits,array_join(array_agg(value.from_url),',') as from_url
FROM "loggings"."logging"
where event='url_event'
group by db.id,userid
),meetings as
(
SELECT dbid,userid AS userid,count(*) as nb_interviews,array_join(array_agg(interviewer),') as interviewer
FROM "meetings"."meeting"
group by dbid,chats as
(
SELECT dbid,r1.user._id AS userid,count(_id) as nb_chat
FROM "lives"."live",UNNEST(users) AS r1 (user)
group by dbid,r1.user._id
)
select *
from logins l
left join visits v
on l.dbid = v.dbid
and l.userid = v.userid
left join meetings m
on l.dbid = m.dbid
and l.userid = m.userid
left join chats c
on l.dbid = c.dbid
and l.userid = c.userid;