【问题标题】:SQL Query to check Range用于检查范围的 SQL 查询
【发布时间】:2015-05-03 21:37:09
【问题描述】:

我正在尝试编写一个 SQL 查询,该查询基本上采用已为特定日期插入的起始值和结束值,并将它们与所有起始值和结束值进行比较,以输出不冲突的所有内容。换句话说,我正在编写一个日程安排应用程序,它应该告诉一个人由于日程安排冲突而不能参加的课程。这就是我现在拥有的:

    SELECT C2.COURSENUM, C2.SECTIONID
    FROM TIMES T2, CLASSES C2
    WHERE T2.SECTIONID = C2.SECTIONID AND 
    (T2.MONSTART >= 
        (SELECT T.MONEND
        FROM DEGAUDIT D, UNDERGRAD S, TIMES T, CLASSES C
        WHERE D.SID = S.SID AND S.SSN = ? AND C.SECTIONID = T.SECTIONID 
        AND D.SECTIONID = C.SECTIONID)

        OR T2.MONEND <= 

            (SELECT T.MONSTART
            FROM DEGAUDIT D, UNDERGRAD S, TIMES T, CLASSES C
            WHERE D.SID = S.SID AND S.SSN = ? AND 
            C.SECTIONID = T.SECTIONID 
            AND D.SECTIONID = C.SECTIONID))

MonStart 和 MonEnd 分别是我的开始时间和结束时间。现在,我遇到了麻烦,因为两个子查询都返回了一个以上的值,您不能将其与 = 符号一起使用。有没有办法使用 IN 或 NOT IN 来完成这项任务?谢谢!非常感谢您的帮助。

【问题讨论】:

  • MySQL 和/或 sqlite?尝试重写为不带子查询的连接。
  • 您问题的目的本身并不清楚。另外,你能粘贴你的表的模式吗?

标签: mysql sql sqlite jdbc


【解决方案1】:

这是您问题的简化版本,仅显示一个表格“时间”来说明这个想法。

我的建议是,您将逻辑转一圈,将当前时隙与所有其他时隙进行比较,看看是否有 任何重叠。如果有,则排除当前时隙。所以它看起来像这样:-

CREATE TABLE times
(
TimeID int,
StartTime Time,
EndTime Time
)

INSERT INTO times
VALUES
(1,'10:00:00','12:00:00'),
(2,'10:00:00','12:00:00'),
(3,'14:00:00','16:00:00'),
(4,'14:00:00','16:00:00'),
(5,'12:00:00','13:00:00'),
(6,'13:00:00','14:00:00')

SELECT  *
FROM times tim

WHERE not exists

(
    SELECT
    TimeID FROM
    times tom
    WHERE
    tom.EndTime>tim.StartTime
    AND
    tom.StartTime<tim.EndTime
    AND
    tom.TimeID<>tim.TimeID
)

只有最后两个时隙与任何其他时隙没有重叠。

cf this answer,但你想要 而不是 = 因为只要学生可以足够快地从一个班级到另一个班级,你不介意范围是否接触 :-)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-10
    • 1970-01-01
    • 2013-09-21
    • 1970-01-01
    • 1970-01-01
    • 2020-05-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多