- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 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 中是唯一的,但在整个 efforts 表中不是唯一的。
因此对于每个 raw_time,因为我们知道 event_group_id 和 bib_number,所以我们可以确定它与哪个工作相关。了解工作可以让我们也了解事件(因为工作有一个 event_id)。
一个事件通过 aid_stations 连接表有很多 split 。拆分名称在一个事件中是唯一的。因为我们知道事件(如上所述确定)并且我们知道拆分名称(它是 raw_times 表中的一列),所以我们可以确定 split_id。
对于有匹配的号码布号码和分组名称的记录,查询按预期工作。但是对于号码布或者赛段名不匹配的记录,WHERE子句不满足,所以根本不返回raw_time记录。
我尝试用 LEFT JOIN 代替每个 INNER JOIN 进行查询,但我得到了相同的结果。
我想要的是返回所有raw_time记录,但是如果没有匹配的split name,则返回split_id为NULL的记录,如果没有匹配的号码布,则返回为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
最佳答案
通过具有示例数据和想要的结果的优势,“缺失元素”似乎是通过 split_id 的相关子查询对有限结果的需要。
在 rextester.com 查看在 PostgreSQL 9.6 中的工作
CREATE TABLE raw_times
(id int, event_group_id int, parameterized_split_name varchar(11), bib_number int)
;
INSERT INTO raw_times
(id, event_group_id, parameterized_split_name, bib_number)
VALUES
(3, 53, 'finish', 11),
(4, 53, 'finish', 603),
(5, 53, 'finish', 9999),
(6, 53, 'nonexistent', 603)
;
CREATE TABLE event_groups
(id int)
;
INSERT INTO event_groups
(id)
VALUES
(53)
;
CREATE TABLE efforts
(id int, event_id int, bib_number int)
;
INSERT INTO efforts
(id, event_id, bib_number)
VALUES
(22183, 26, 11),
(22400, 28, 603)
;
CREATE TABLE aid_stations
(id int, event_id int, split_id int)
;
INSERT INTO aid_stations
(id, event_id, split_id)
VALUES
(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)
;
CREATE TABLE splits
(id int, parameterized_base_name varchar(6))
;
INSERT INTO splits
(id, parameterized_base_name)
VALUES
(30, 'finish'),
(31, 'start'),
(106, 'aid-1'),
(109, 'aid-4'),
(111, 'aid-2'),
(112, 'aid-3'),
(113, 'aid-5'),
(118, 'start'),
(119, 'finish')
;
查询 1:
select
r.id, r.event_group_id, r.parameterized_split_name, r.bib_number
, e.id as effort_id
, e.event_id
, s.split_id
from raw_times r
left join (
select ef.id, ef.event_id, ef.bib_number, ev.event_group_id
from efforts ef
inner join events ev on ef.event_id = ev.id
) e on r.bib_number = e.bib_number
and e.event_group_id = r.event_group_id
left join lateral (
select a.split_id from aid_stations a
inner join splits s on a.split_id = s.id
where a.event_id = e.event_id
and s.parameterized_base_name = r.parameterized_split_name
limit 1) s on true
order by r.bib_number, r.id
;
结果:
| 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) |
注意。如果使用旧版本的 Postgres,则可以在 select 子句中使用相关子查询来代替上面看到的 left join lateral
。
关于当 WHERE 不匹配时返回具有特定 NULL 值的记录的 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49869487/
这是代码片段。 请说出这种用小内存存储大数据的算法是什么。 public static void main(String[] args) { long longValue = 21474836
所以我使用 imap 从 gmail 和 outlook 接收电子邮件。 Gmail 像这样编码 =?UTF-8?B?UmU6IM69zq3OvyDOtc68zrHOuc67IG5ldyBlbWFpb
很久以前就学会了 C 代码;想用 Scheme 尝试一些新的和不同的东西。我正在尝试制作一个接受两个参数并返回两者中较大者的过程,例如 (define (larger x y) (if (> x
Azure 恢复服务保管库有两个备份配置选项 - LRS 与 GRS 这是一个有关 Azure 恢复服务保管库的问题。 当其驻留区域发生故障时,如何处理启用异地冗余的恢复服务保管库?如果未为恢复服务启
说,我有以下实体: @Entity public class A { @Id @GeneratedValue private Long id; @Embedded private
我有下一个问题。 我有下一个标准: criteria.add(Restrictions.in("entity.otherEntity", getOtherEntitiesList())); 如果我的
如果这是任何类型的重复,我会提前申请,但我找不到任何可以解决我的具体问题的内容。 这是我的程序: import java.util.Random; public class CarnivalGame{
我目前正在使用golang创建一个聚合管道,在其中使用“$ or”运算符查询文档。 结果是一堆需要分组的未分组文档,这样我就可以进入下一阶段,找到两个数据集之间的交集。 然后将其用于在单独的集合中进行
是否可以在正则表达式中创建 OR 条件。 我正在尝试查找包含此类模式的文件名列表的匹配项 第一个案例 xxxxx-hello.file 或者案例二 xxxx-hello-unasigned.file
该程序只是在用户输入行数时创建菱形的形状,因此它有 6 个 for 循环; 3 个循环创建第一个三角形,3 个循环创建另一个三角形,通过这 2 个三角形和 6 个循环,我们得到了一个菱形,这是整个程序
我有一个像这样的查询字符串 www.google.com?Department=Education & Finance&Department=Health 我有这些 li 标签,它们的查询字符串是这样
我有一个带有静态构造函数的类,我用它来读取 app.config 值。如何使用不同的配置值对类进行单元测试。我正在考虑在不同的应用程序域中运行每个测试,这样我就可以为每个测试执行静态构造函数 - 但我
我正在寻找一个可以容纳多个键的容器,如果我为其中一个键值输入保留值(例如 0),它会被视为“或”搜索。 map, int > myContainer; myContainer.insert(make_
我正在为 Web 应用程序创建数据库,并正在寻找一些建议来对可能具有多种类型的单个实体进行建模,每种类型具有不同的属性。 作为示例,假设我想为“数据源”对象创建一个关系模型。所有数据源都会有一些共享属
(1) =>CREATE TABLE T1(id BIGSERIAL PRIMARY KEY, name TEXT); CREATE TABLE (2) =>INSERT INTO T1 (name)
我不确定在使用别名时如何解决不明确的列引用。 假设有两个表,a 和 b,它们都有一个 name 列。如果我加入这两个表并为结果添加别名,我不知道如何为这两个表引用 name 列。我已经尝试了一些变体,
我的查询是: select * from table where id IN (1,5,4,3,2) 我想要的与这个顺序完全相同,不是从1...5,而是从1,5,4,3,2。我怎样才能做到这一点? 最
我正在使用 C# 代码执行动态生成的 MySQL 查询。抛出异常: CREATE TABLE dump ("@employee_OID" VARCHAR(50)); "{"You have an er
我有日期 2016-03-30T23:59:59.000000+0000。我可以知道它的格式是什么吗?因为如果我使用 yyyy-MM-dd'T'HH:mm:ss.SSS,它会抛出异常 最佳答案 Sim
我有一个示例模式,它的 SQL Fiddle 如下: http://sqlfiddle.com/#!2/6816b/2 这个 fiddle 只是根据 where 子句中的条件查询示例数据库,如下所示:
我是一名优秀的程序员,十分优秀!