Oracle范围和子查询

3

我有一个表,想要对它自己进行查询,但不确定如何操作。

表名:schedule

  • user_id
  • startdate
  • enddate
  • sequencyID

情况是,我有许多行,其中 user_id = 0。这表示存在开放的日程表,可以由任何人来申领。如果有人申领了某个日程,那么该日程就会被分配到特定的用户 ID 上。这里涉及到的难点在于,我正在尝试选择一个用户,并显示他们还没有接受或安排的时间表,以避免与已经接受或安排的时间表重叠。

以下是我目前的进展:

SELECT * 
  FROM schedule 
 WHERE user_id = 123456;

这让我获得了一个人已经接受的所有时间范围。
SELECT * 
  FROM schedule 
 WHERE user_id = 0;

这段代码可以获取所有可用的日程行。但我不太确定如何将它们组合在一起,使最终结果是一个用户ID为0且开始日期/结束日期不存在于已分配用户的开始日期和结束日期之间的日程元素列表。

我认为应该像这样:

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

我正在苦恼的是“where”这个问题。有什么想法吗?如果有人能够至少指出我开始解决这类问题所需使用的机制,那就太棒了。

2个回答

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

我认为这样做应该可以。我现在无法在这里测试,但你可以试一下。

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

如果一个父记录有多个子记录相关联,使用JOINs操作可能会出现重复数据的风险。 - OMG Ponies

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接