子查询之间的SQL
我想知道如何运行SQL查询,以返回时间在有效段中的事件 例如,我有两张桌子 事件 分段 我想要一个可以返回的查询子查询之间的SQL,sql,subquery,Sql,Subquery,我想知道如何运行SQL查询,以返回时间在有效段中的事件 例如,我有两张桌子 事件 分段 我想要一个可以返回的查询 event_id event_time 1 434 2 4300 我在想 SELECT * FROM event WHERE event.event_time > (SELECT segment.segment_start_time FROM segment) AND event.event_time < (SE
event_id event_time
1 434
2 4300
我在想
SELECT *
FROM event
WHERE
event.event_time > (SELECT segment.segment_start_time FROM segment)
AND
event.event_time < (SELECT segment.segment_end_time FROM segment)
在存在或联接的位置使用
SELECT event_id, event_time
FROM event
WHERE EXISTS
(
SELECT *
FROM segment
WHERE event.event_time BETWEEN segment_start_time AND segment_end_time
)
我假设事件表中的条目通常比段表中的条目多
SELECT
event.event_id, event.event_time
FROM
segment
INNER JOIN
event
ON event.event_time >= segment.segment_start_time
AND event.event_time < segment.segment_end_time
GROUP BY
event.event_id, event.event_time
这允许PSEDOO代码用于每个段,检查哪些事件有效。这允许在事件表上查找范围
SELECT
event.event_id, event.event_time
FROM
segment
INNER JOIN
event
ON event.event_time >= segment.segment_start_time
AND event.event_time < segment.segment_end_time
GROUP BY
event.event_id, event.event_time
如果段不重叠,如果DBMS未实现偏移/提取语法,则还可以使用此adapt with TOP或LIMIT或任何专有语法:
我想这是我在寻找的问题,但我不是100%确定
SELECT *
FROM event
WHERE EXISTS
(
SELECT *
FROM segment
WHERE (event.time BETWEEN segment.start_time AND segment.end_time
AND segment.type IN ("data1", "data2"))
) AND EXISTS
(
SELECT *
FROM segment
WHERE (event.time NOT BETWEEN segment.start_time AND segment.end_time
AND segment.type ("veto1", "veto2"))
)
假设索引为segmentstart,end,这意味着每个从0开始到event.event_time的段都需要检查其结束。半笛卡尔积…不同的部分会重叠吗?事件或分段是否会有更多记录?您使用的是什么数据库和版本?分段可能会重叠,但只有不同“类型”的分段-请参阅下面我的评论。我正在使用SQlite 3.7.13谢谢@Dems。这似乎奏效了。是的,有些部分可以重叠。但更准确地说,段表有四种不同的段;数据1和数据2,veto1和veto2。实际上,我想列出的事件的时间在data1-veto1交叉点data2-veto1中。@ShaunH-我不知道你说的data1-veto1交叉点data2-veto1是什么意思。请您使用示例数据和演示真实场景的所需输出更新您的问题,好吗?我已经编辑了问题。抱歉,如果听起来很复杂,那就是为什么我没有全部陈述的原因initialy@ShaunH-添加了一个HAVING子句,以我理解您的示例。抱歉,这不起作用。但我认为逻辑是错误的。事件时间必须位于两种数据段的交叉点,即它必须与data1段和data2段相交。我想我已经通过查询解决了这个问题-见下文。对于第二个存在,如果事件时间在任何vetos之外,它将返回TRUE。因此,即使它与veto1发生碰撞,它仍然在veto2之外,因此总体情况是正确的,尽管你希望它是错误的。请参阅此链接。。。我的只返回事件2,你的返回事件1和2
SELECT
event.event_id, event.event_time
FROM
segment
INNER JOIN
event
ON event.event_time >= segment.segment_start_time
AND event.event_time < segment.segment_end_time
GROUP BY
event.event_id, event.event_time
SELECT
event.event_id, event.event_time
FROM
segment
INNER JOIN
event
ON event.event_time >= segment.segment_start_time
AND event.event_time < segment.segment_end_time
GROUP BY
event.event_id, event.event_time
HAVING
0 = SUM(CASE WHEN segment_type = 'veto1' THEN 1 ELSE 0 END)
AND 0 = SUM(CASE WHEN segment_type = 'veto2' THEN 1 ELSE 0 END)
AND 1 = SUM(CASE WHEN segment_type = 'data1' THEN 1 ELSE 0 END)
AND 1 = SUM(CASE WHEN segment_type = 'data2' THEN 1 ELSE 0 END)
SELECT
event_id, event_time
FROM
event AS e
WHERE
event_time <
( SELECT
s.segment_end_time
FROM
segment AS s
WHERE
s.segment_start_time <= e.event_time
ORDER BY
s.segment_start_time DESC
OFFSET 1 ROWS
FETCH NEXT 1 ROWS ONLY
) ;
SELECT *
FROM event
WHERE EXISTS
(
SELECT *
FROM segment
WHERE (event.time BETWEEN segment.start_time AND segment.end_time
AND segment.type IN ("data1", "data2"))
) AND EXISTS
(
SELECT *
FROM segment
WHERE (event.time NOT BETWEEN segment.start_time AND segment.end_time
AND segment.type ("veto1", "veto2"))
)