gpt4 book ai didi

sql - 如何在 SQL 中查询表的层次结构

转载 作者:行者123 更新时间:2023-11-29 13:13:03 25 4
gpt4 key购买 nike

我有一张 table ,开会。在这些 session 中存在一个层次结构。其中一些是年度 session ,大多数只是定期 session 。

所有常规 session 将与至少一个连接表meeting_yearly_meeting 相关联。 meeting_yearly_meeting 有两列:meeting_idyearly_meeting_id

下面是这两个表的样子:

session :

id SERIAL PRIMARY KEY,
title VARCHAR(255),
mappable BOOLEAN,
phone VARCHAR(255),
email VARCHAR(255),
city VARCHAR(255),
address VARCHAR(255),
zip VARCHAR(255),
latitude NUMERIC,
longitude NUMERIC,
description VARCHAR(255),
worship_time TIME,
state VARCHAR(255),
website VARCHAR(255),
lgbt_affirming BOOLEAN,
created TIMESTAMP default current_timestamp,
updated TIMESTAMP default current_timestamp

meeting_yearly_meeting:

id SERIAL PRIMARY KEY,
meeting_id SMALLINT,
yearly_meeting_id SMALLINT,
created TIMESTAMP default current_timestamp,
updated TIMESTAMP default current_timestamp

因此,从我的 /meetings 端点,我想返回所有 session 的集合——定期 session 和年度 session 。我想返回 session 及其所有专栏,以及一个额外的专栏:yearly_meeting

对于具有一个或多个关联的meeting_yearly_meeting 记录的meeting 记录,yearly_meeting 将是标题的逗号分隔列表meeting 记录被指定为该 meeting 的年度 session 。对于那些没有任何关联的 meeting_yearly_meeting 记录的 session (因此它们本身就是年度 session ),我希望 yearly_meeting 字段为 NULL。

在我追求这个目标的过程中,我尝试了这样的事情:

SELECT t1.*, t2.meeting_yearly_meeting AS yearly_meeting
FROM (
SELECT * FROM meeting
FULL JOIN meeting_yearly_meeting ON meeting.id = meeting_yearly_meeting.yearly_meeting_id;
) as t1,
(
SELECT CASE WHEN (meeting_yearly_meeting.id IS NOT NULL)
THEN (SELECT title FROM meeting WHERE meeting.id = meeting_yearly_meeting.yearly_meeting_id)
ELSE NULL
END
FROM (
SELECT meeting_yearly_meeting.* FROM meeting
FULL JOIN meeting_yearly_meeting ON meeting.id = meeting_yearly_meeting.meeting_id
) as meeting_yearly_meeting;
) as t2;

但这会引发语法错误。

我很欣赏其他人可能有的任何见解。如果您需要任何其他背景信息或说明,请告诉我!

更新:

示例 session 数据:https://gist.github.com/micahbales/4013399c3fd23a0caf108124dab827c8

示例 meeting_yearly_meeting 数据:https://gist.github.com/micahbales/fcbdeef282bd7bf1014606cee43bfb5e

预期返回值示例:https://gist.github.com/micahbales/13d2aafdc5d43c4b948dc39c2df51569

最佳答案

您可以尝试离开加入年度 session ,然后使用 string_agg() 获取您的逗号分隔列表。

SELECT m1.id,
m1.title,
m1.mappable,
m1.phone,
m1.email,
m1.city,
m1.address,
m1.zip,
m1.latitude,
m1.longitude,
m1.description,
m1.worship_time,
m1.state,
m1.website,
m1.lgbt_affirming,
m1.created,
m1.updated,
string_agg(m2.title, ', ') yearly_meeting
FROM meeting m1
LEFT JOIN meeting_yearly_meeting mym1
ON mym1.meeting_id = m1.id
LEFT JOIN meeting m2
ON m2.id = mym1.yearly_meeting_id
GROUP BY m1.id,
m1.title,
m1.mappable,
m1.phone,
m1.email,
m1.city,
m1.address,
m1.zip,
m1.latitude,
m1.longitude,
m1.description,
m1.worship_time,
m1.state,
m1.website,
m1.lgbt_affirming,
m1.created,
m1.updated;

编辑:

更“紧凑”的解决方案可能是使用相关子查询。

SELECT m1.*,
(SELECT string_agg(m2.title, ', ')
FROM meeting_yearly_meeting mym1
LEFT JOIN meeting m2
ON m2.id = mym1.yearly_meeting_id
WHERE mym1.meeting_id = m1.id) yearly_meeting
FROM meeting m1;

但请注意,虽然它的代码更少,但不一定更快。

关于sql - 如何在 SQL 中查询表的层次结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52468281/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com