2

我有一种情况,我想连接两个没有在 Oracle 8i 中链接它们的键的表。我有带有一些信息和日期时间的表 A 和带有一些信息和日期时间的表 B。我想要的是表 A 中的所有内容以及表 B 中表 A 中的相应数据,我将在下面对其进行模拟:

Table A                     |   Table B
John   31/07/2012 10:50:32  |   Travel to Library   31/07/2012 10:48:23
John   31/07/2012 10:55:49  |   Arrive at Library   31/07/2012 11:02:34
John   31/07/2012 11:00:15  |   Reading Book        31/07/2012 11:07:11
John   31/07/2012 11:05:23  |
John   31/07/2012 11:10:12  |

我要创建的是这样的:

John   31/07/2012 10:50:32   Travel to Library   
John   31/07/2012 10:55:49   Travel to Library       
John   31/07/2012 11:00:15   Travel to Library            
John   31/07/2012 11:05:23   Arrive at Library
John   31/07/2012 11:10:12   Reading Book

可能有人怀疑这与包含我每 5 分钟接收一次的 GPS 数据的表格和列出活动的另一个完全不相关的表格有关。到目前为止,我最接近的尝试是分两部分编写查询,第一部分是查看活动并返回活动日期和下一个活动日期,然后根据相关人员的姓名连接两个表并返回 GPS 数据当它在两个活动日期之间时,我也用 GPS 日期和下一个 GPS 日期以相反的方式完成它,如果它在这两个日期之间,则返回活动。两种方法都不会返回任何一组数据。

我觉得我的主要故障在于我使用跳跃/滞后函数来获取日期时间之前或之后。也许我只是忽略了明显的答案。

我真的可以使用一些帮助来为我指明正确的方向。

4

2 回答 2

2

您使用的是 8i,它真的很旧。但是,如果您使用的是 8.1.6 或更高版本,则可以使用 LEAD() 分析函数获得所需的结果。您没有提供实际的表结构,所以我像这样模拟了它们:

create table A (name varchar2(10), dt date);           
create table B (event varchar2(20), dt date);   

鉴于这些列表,此查询将起作用:

select a.name, a.dt, b.event
from a 
     , ( select b.* 
         , lead (b.dt, 1, null) over
              (order by dt asc) as next_dt
        from b ) b
where a.dt >= b.dt
and ( a.dt < b.next_dt or b.next_dt is null)

SQL Fiddle 使用 11gR2,但此语法在 8i 上仍应有效。

注意:分析功能仅在 9iR1(9.0.1.3 或类似版本)的某个点发布之前使用 Enterprise Edition 获得许可,如果您对这些细节感到困扰的话。

于 2012-09-03T15:42:47.440 回答
1

尝试这个:

select Name, Time, Activity from
(
    select
        a.Name, a.Time, b.Activity,
        row_number() over (partition by a.Time order by b.time desc) as rn
    from TableA a, TableB b
    where a.time >= b.time and a.Name = b.Name
)
where rn = 1;

注意:我假设 GPS 数据在表中也带有一个名称。

于 2012-09-03T14:13:20.197 回答