2015-03-03 260 views
1

我正在嘗試編寫一個SQL查詢,該查詢基本上採用了已經爲特定日期插入的起始值和結束值,並將它們與所有起始值和結束值進行比較,以輸出沒有「沒有衝突。換句話說,我正在編寫一個時間安排應用程序,它應該告訴一個人由於時間安排衝突而不能採取的課程。這是我現在所擁有的: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來完成此任務?謝謝!非常感謝您的幫助。

+0

MySQL和/或sqlite?嘗試重寫爲沒有子查詢的連接。 – jarlh 2015-03-03 09:41:46

+0

您的問題的目標本身並不明確。另外,你可以粘貼你的表格模式嗎? – none 2015-03-03 10:34:55

回答

0

這是你的問題的簡化版本,只是顯示一個表'時間'來說明這個想法。

我的建議是,你把邏輯輪和所有其他時間槽比較當前時隙,看看是否有任何重疊。如果有,則排除當前時隙。所以它看起來像這樣: -

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,但你要<和>,而不是< =和> =,因爲你如果觸及範圍,只要學生能夠從一類到另一個速度不夠快:-)不介意

+0

謝謝!這有幫助! – saupton 2015-03-09 19:31:08

+0

這很好,謝謝你的反饋。 – 2015-03-09 20:58:57