oracle 中有一个表 srm_price 存在 start_date 和 end_date 两个日期表示一个时间范围,查找不同记录之间存在时间段交叉的sql语句怎么写
时间: 2024-10-09 15:14:31 浏览: 31
srm.zip_SRM_SRM segmentation_image segmentation_segmentation ima
在Oracle中,如果你想要找出`srm_price`表中不同记录间存在时间段交叉的情况,你可以通过自连接查询结合`EXISTS`和`INTERSECT`关键字来实现。假设你想找出所有start_date小于end_date的行,并检查它们是否与其他行的start_date和end_date有交叉,可以尝试以下SQL语句:
```sql
SELECT a.*, b.*
FROM srm_price a
JOIN srm_price b ON (
a.start_date < b.end_date AND
a.end_date > b.start_date AND
NOT EXISTS (
SELECT 1
FROM srm_price c
WHERE c.start_date BETWEEN a.start_date AND a.end_date AND
c.end_date BETWEEN a.start_date AND a.end_date
)
)
INTERSECT
SELECT * FROM (
SELECT * FROM srm_price a
JOIN srm_price b ON (
b.start_date < a.end_date AND
b.end_date > a.start_date AND
NOT EXISTS (
SELECT 1
FROM srm_price c
WHERE c.start_date BETWEEN b.start_date AND b.end_date AND
c.end_date BETWEEN b.start_date AND b.end_date
)
)
);
```
这个查询首先会找到所有可能的交叉区间对(a和b),然后排除那些在c中也有完整覆盖的交叉区间。`INTERSECT`操作则保留这两个集合的交集,即确实存在交叉的记录。
阅读全文