PostgreSQL查询失效求助:如何找出拥有多个日历的用户及其关联事件记录
解决PostgreSQL多日历用户及其关联事件的查询问题
我来帮你排查这个SQL问题并给出正确的查询语句~
你的查询问题所在
你写的子查询只返回了person_id和计数结果,没有包含calendars表的uuid字段,所以在ON calendars.uuid = events.calendar_id这一步会报错——因为子查询生成的临时表根本没有uuid这个列,自然无法关联。
正确的查询语句
我们需要先筛选出拥有多个日历的用户,再依次关联calendars和events表,拿到对应的所有记录:
SELECT c.uuid AS calendar_uuid, c.person_id, e.uuid AS event_uuid, e.calendar_id, e.event_id FROM events e INNER JOIN calendars c ON e.calendar_id = c.uuid INNER JOIN ( -- 先找出拥有多个日历的用户ID SELECT person_id FROM calendars GROUP BY person_id HAVING COUNT(*) > 1 ) AS duplicate_users ON c.person_id = duplicate_users.person_id ORDER BY c.person_id, c.uuid;
语句解释
- 子查询
duplicate_users:筛选出所有在calendars表中出现次数超过1次的person_id,也就是拥有多个日历的用户。 - 第一步关联:把
events和calendars表通过calendar_id关联,拿到每个事件对应的日历基本信息。 - 第二步关联:通过
person_id和子查询结果关联,只保留那些属于多日历用户的日历和事件记录。
用你提供的示例数据,这个查询会返回person_id=4和5的所有日历及其关联的事件,完全符合你的需求。
后续添加唯一约束的步骤
当你清理完这些重复的日历记录后,就可以给calendars表的person_id添加唯一约束,确保每个用户只能拥有一条日历记录:
ALTER TABLE calendars ADD CONSTRAINT unique_calendar_person_id UNIQUE (person_id);
内容的提问来源于stack exchange,提问作者BEDev
相关产品推荐
相关产品推荐

