Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
子查询之间的SQL_Sql_Subquery - Fatal编程技术网

子查询之间的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

我想知道如何运行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 < (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"))
)