2011-05-11 260 views
3

我有一個表,我試圖查詢自己,我不知道如何去做。Oracle範圍和子查詢

表名:時間表

  • USER_ID
  • STARTDATE
  • 結束日期
  • sequencyID

的情況是我有一個數量的行,其中USER_ID = 0這表示某人可以宣稱的公開時間表。如果計劃得到聲明,則會爲其分配特定的用戶標識。這裏是棘手的部分進來。我試圖挑選一個用戶,並顯示與他們已被接受或已安排的時間不重疊的時間表。

這裏是我迄今爲止

SELECT * 
    FROM schedule 
WHERE user_id = 123456; 

這讓我的時間全部範圍內的人已經接受

SELECT * 
    FROM schedule 
WHERE user_id = 0; 

這讓我可用的所有日程安排行。我不太確定如何組合它們,以便最終結果是一個計劃元素列表,其中user_id = 0,startdate/enddate不存在於已分配用戶的開始日期和結束日期之間。

我認爲這將是這樣的

SELECT * 
    FROM schedule 
WHERE user_id = 0 
    AND (loop through schedule rows testing for 
      (startdate < loopstartdate and enddate < loopstartdate) || 
      (startdate > loopenddate) 

的地方就是我掙扎。有任何想法嗎?如果有人能夠至少指出我正確地使用什麼機制來開始解決這種令人敬畏的問題。

回答

2
SELECT a.* 
FROM schedule a 
WHERE user_id = 0 
    AND NOT EXISTS (
    SELECT NULL 
     FROM schedule b 
     WHERE b.user_id = 123456 
     AND b.start_date <= a.end_date 
     AND b.end_date >= a.start_date 
) 
+0

所以我做了相當數量的數據測試,並且這個工作非常完美!!!!! – Doug

0

我認爲這樣的事情會起作用。我實際上無法測試我在哪裏,但給它射擊。

SELECT a.* 
FROM SCHEDULE a, 
(SELECT start_date, end_date FROM SCHEDULE WHERE user_id = 123456) b 
WHERE a.user_id = 0 
AND a.start_date BETWEEN b.start_date AND b.end_date 
+0

JOIN的風險副本,如果有涉及到父母不止一個子女的記錄。 –