Oracle范围和子查询

时间:2011-05-11 00:07:25

标签: sql oracle

我有一张表,我试图查询自己,我不知道该怎么做。

表名:时间表

  • USER_ID
  • STARTDATE
  • 结束日期
  • sequencyID

情况是我有多行,其中user_id = 0.这表示某人可以声明的开放时间表。如果计划被声明,则会为其分配特定的用户ID。这里是棘手的部分。我试图选择一个用户并显示与他们已被接受或已安排的内容重叠的时间表。

这是我到目前为止所拥有的

SELECT * 
  FROM schedule 
 WHERE user_id = 123456;

这让我了解了一个人已经接受的所有时间范围

SELECT * 
  FROM schedule 
 WHERE user_id = 0;

这会获取所有可用的计划行。我不太确定如何将它们组合起来,以便最终结果是一个调度元素列表,其中user_id = 0,startdate / enddate在startdate和endate之间不存在已经分配给用户的那些。

我认为它会像

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

我正在努力的地方。有任何想法吗?如果有人能够至少指出我正确的方向,我会用什么机制来解决这类令人敬畏的问题。

2 个答案:

答案 0 :(得分: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
  )

答案 1 :(得分: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