oracle 使用 INTERSECT 查找 start_date 和 end_date 存在并集的记录
时间: 2024-10-09 22:13:57 浏览: 33
在Oracle中,如果你想通过`INTERSECT`查找两个查询的`start_date`和`end_date`字段存在交集的记录,你可以编写如下的SQL语句:
```sql
SELECT *
FROM (
SELECT * FROM table1
WHERE start_date IS NOT NULL AND end_date IS NOT NULL
) AS result1
INTERSECT
SELECT * FROM (
SELECT * FROM table2
WHERE start_date IS NOT NULL AND end_date IS NOT NULL
) AS result2;
```
在这个例子中,假设`table1`和`table2`分别是两个你关心的数据表,`start_date`和`end_date`是这两个表中的日期字段。首先,我们分别从每个表中选择出`start_date`和`end_date`都不为空的记录,然后使用`INTERSECT`找出这两个集合之间的交集部分。
请注意,这个查询只返回`start_date`和`end_date`字段都存在的记录。如果你需要其他特定列的信息,只需将`*`替换为你感兴趣的列名即可。
相关问题
oracle 中有一个表 srm_price 存在 start_date 和 end_date 两个日期范围字段,查找全部存在日期交叉的记录的sql怎么写
在Oracle中,要找出`srm_price`表中两个日期范围(`start_date`和`end_date`)存在交集的所有记录,可以使用`INTERSECT`或`MINUS`操作符。这里假设`start_date`小于`end_date`。你可以尝试以下SQL查询:
```sql
-- 使用 INTERSECT 来找到有交集的记录
SELECT * FROM (
SELECT * FROM srm_price
WHERE start_date < '2099-12-31' AND end_date > SYSDATE
) AS t1
INTERSECT
SELECT * FROM (
SELECT * FROM srm_price
WHERE start_date > SYSDATE - INTERVAL '1' DAY AND end_date <= '2099-12-31'
) AS t2;
-- 使用 MINUS 可能会有遗漏,因为它只返回t1中有而t2中无的数据,所以需要反向查询
-- 如果需要完整结果,可能需要结合使用
SELECT * FROM (
SELECT * FROM srm_price
WHERE start_date < '2099-12-31' AND end_date > SYSDATE
) AS t1
MINUS
SELECT * FROM (
SELECT * FROM srm_price
WHERE start_date > SYSDATE - INTERVAL '1' DAY AND end_date <= '2099-12-31'
) AS t2;
```
这个查询首先选择出所有`start_date`小于等于当前日期并且`end_date`大于当前日期的记录(t1),然后选择出所有`start_date`大于当前日期减一天并且`end_date`小于等于当前日期的记录(t2)。通过`INTERSECT`操作,我们得到的是这两个集合都存在的记录。
请注意,这里的日期边界是硬编码的,你需要根据实际需求调整它们。此外,这个查询可能会受到系统时间的限制,如果你的数据跨越了很多年,可能需要更复杂的处理。
oracle 中有一个表 srm_price 存在 start_date 和 end_date 两个日期表示一个时间范围,查找不同记录之间存在时间段交叉的sql语句怎么写
在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`操作则保留这两个集合的交集,即确实存在交叉的记录。
阅读全文