【发布时间】:2018-04-17 03:36:04
【问题描述】:
我在 Postgres 中运行以下查询:
SELECT raw_times.*, efforts.id as effort_id, efforts.event_id as event_id, splits.id as split_id
FROM raw_times
INNER JOIN event_groups ON event_groups.id = raw_times.event_group_id
INNER JOIN events ON events.event_group_id = event_groups.id
INNER JOIN efforts ON efforts.event_id = events.id
INNER JOIN aid_stations ON aid_stations.event_id = events.id
INNER JOIN splits ON splits.id = aid_stations.split_id
WHERE efforts.bib_number::text = raw_times.bib_number
AND splits.parameterized_base_name = raw_times.parameterized_split_name
这个想法是找到匹配的号码布号码和拆分名称,并返回填充了各种关系 id 的 raw_time 记录。
用简单的英语来说,逻辑是这样工作的:对于每个 raw_time,检查 event_group_id。一个 event_group 有很多事件,一个事件有很多努力,努力表有一个 bib_number 列。参赛号码在 event_group 中是唯一的,但在整个努力表中不是唯一的。
所以对于每个 raw_time,因为我们知道 event_group_id 和 bib_number,我们可以确定它与哪个工作量相关。知道努力可以让我们也知道事件(因为努力有一个 event_id)。
一个事件通过aid_stations 连接表有许多拆分。拆分名称在事件中是唯一的。因为我们知道事件(如上所述确定)并且我们知道拆分名称(它是 raw_times 表上的一列),所以我们可以确定 split_id。
对于有匹配的书目号和拆分名称的记录,查询按预期工作。但是对于 bib 编号或拆分名称不匹配的记录,不满足 WHERE 子句,因此根本不返回 raw_time 记录。
我已经尝试使用 LEFT JOIN 代替每个 INNER JOIN 进行查询,但我得到了相同的结果。
我想要的是返回所有 raw_time 记录,但是如果没有匹配的拆分名称,则返回 split_id 为 NULL 的记录,如果没有匹配的 bib 号码,则返回 NULL 的记录effort_id、event_id 和 split_id。
raw_times 表如下所示:
id event_group_id parameterized_split_name bib_number
3 53 finish 11
4 53 finish 603
5 53 finish 9999
6 53 nonexistent 603
event_groups 表如下所示:
id
53
51
事件表如下所示:
id event_group_id
26 53
28 53
18 51
努力表如下所示:
id event_id bib_number
22183 26 11
22400 28 603
5747 18 11
aid_stations 表如下所示:
id event_id split_id
236 26 30
237 26 31
238 26 106
239 26 111
240 26 112
241 26 109
242 26 113
254 28 119
255 28 118
138 18 1
150 18 16
拆分表如下所示:
id parameterized_base_name
30 finish
31 start
106 aid-1
109 aid-4
111 aid-2
112 aid-3
113 aid-5
118 start
119 finish
1 start
16 finish
查询应该返回:
id event_group_id parameterized_split_name bib_number effort_id event_id split_id
3 53 finish 11 22183 26 30
4 53 finish 603 22400 28 119
6 53 nonexistent 603 22400 28 NULL
5 53 finish 9999 NULL NULL NULL
这里是 ERD 的链接:https://github.com/SplitTime/OpenSplitTime/blob/master/erd.pdf
【问题讨论】:
-
要解决您的直接问题(可选连接),解决方案肯定是使用外连接(即
LEFT JOIN)和ON部分内的连接。 -
为了帮助它有一个关系图真的很有帮助 - 所有表及其关系的图片 - 最重要的是关系的一对多方面。当您加入实际上是多对多的表时,您会得到“重复计算”
-
PS 我查看了您的网站 - 看起来非常棒。
-
@Nick.McDermaid 感谢您的 cmets 和客气话。我在问题中添加了指向 ERD 的链接。
标签: sql postgresql