SELECT WHERE查询跨越RotationID列链接的众多行

时间:2017-07-17 15:22:33

标签: oracle

首先,为粗略的标题道歉。真的不确定如何简单地总结一下。我对SQL也很陌生,但是找不到任何可以帮助的东西...

数据有四个相关的列。 RotationID,DutyPeriod,ReportTime,ReleaseTime。

RotationID | DutyPeriod | ReportTime | ReleaseTime
--------------------------------------------------
12         | 1          | 17Jul-0345 | 17Jul-1130
12         | 2          | 18Jul-1000 | 18Jul-1800
12         | 3          | 19Jul-0730 | 19Jul-1245
23         | 1          | 17Jul-0315 | 17Jul-1030
34         | 1          | 16Jul-0700 | 16Jul-0930
34         | 2          | 17Jul-0615 | 17Jul-1140
34         | 3          | 18Jul-1115 | 18Jul-1910

RotationID最多可以有5个DutyPeriod,每个DutyPeriod都保存在不同的行中。我想运行一个查询,该查询返回所有不同的RotationID,它们在前两个小时内发布了一个工作期,并在将来报告了16到26个小时。

我只是非常难以接受查询以返回符合这两个标准的ID,而不仅仅是其中之一。此外,sysdate列的格式正确,以便与sysdate一起使用,我只是不想输出示例数据的完整格式。

我玩过自我联盟,父母专栏(从未使用它们,似乎很混乱),甚至玩弄了一个案例滞后陈述的想法,但是还没有能够找出有效的方法。

我附上了示例表here的屏幕截图。绿色突出显示的行是符合两个条件的行,黄色突出显示的行是仅满足两个条件之一且不应返回的行。如果这也很重要,那么它将保存在Oracle数据库中。

所以,给出最简单的查询概念:

SELECT DISTINCT erd.RotationID FROM css.empl_rotation_duty erd
WHERE erd.ReportTime BETWEEN sysdate - (2/24) AND sysdate
AND erd.ReleaseTime BETWEEN sysdate + (16/24) AND sysdate + (26/24)

预期查询的输出应该是,假设查询是在7月17日的1200

运行的
RotationID |
------------
12
34
78
90

1 个答案:

答案 0 :(得分:2)

这听起来像你想要的:

//for hold and wait, just don't allocate the resource if a thread asks for it. Just wait and execute the other one

//t1-> request W. requires W
//t2-> has W
//t1 checks if W is free. wait
//t2 executes. Releases W
//t1 executes

//basically, if all locks are free, execute, else not.