Sql 无键连接表

Sql 无键连接表,sql,oracle,Sql,Oracle,我有一种情况,我想连接两个表,而这两个表没有在Oracle 8i中链接它们的键。表A有一些信息和日期时间,表B有一些信息和日期时间。我想要的是表A中的所有内容,以及表A中表B中的相应数据,我将在下面对其进行模拟: 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 |

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

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
正如可能怀疑的那样,这与一个包含GPS数据的表格有关,我每5分钟收到一次GPS数据,而另一个完全不相关的表格列出了活动。到目前为止,我最接近的尝试是将查询分为两部分:第一部分是查看活动并返回活动日期和下一个活动日期,然后根据相关人员的姓名连接两个表,并在两个活动日期之间返回GPS数据,我也用相反的方法处理了GPS日期和下一个GPS日期,如果介于两者之间,则返回活动。这两种方法都不能返回任意一组数据

我觉得我的主要故障在于使用leap/lag函数来获取日期时间之前或之后的数据。也许我只是忽略了显而易见的答案

我真的需要一些帮助来为我指明正确的方向。

试试这个:

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数据在表中也有一个名称。

您使用的是8i,它非常旧。但是,如果您使用的是8.1.6或更高版本,则可以使用LEAD分析功能获得所需的结果。您没有提供实际的表结构,因此我对它们进行了如下模拟:

create table A (name varchar2(10), dt date);           
create table B (event varchar2(20), dt date);   
Gven此查询将使用的列表:

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)
但是这种语法应该仍然适用于8i


注意:在9iR1 9.0.1.3或类似的版本发布之前,分析功能只能通过Enterprise Edition获得许可,如果您对这些细节感到困扰的话

我的想法也是一个滞后函数。你能发布你试过的吗?如果Steve 31/07/2012 11:00:15表A中的另一个人同时到达图书馆,并在2012年7月31日11:03:34两次不同的到达时间间隔1分钟。OP声明他们在8i上。仅在9i中引入了对ANSI连接语法的支持。@APC:谢谢您提供的信息。现在应该可以修复了。谢谢你的回答,你猜对了,有一个连接是通过name建立的。这个SQL似乎工作得很好。性能受到了很大的影响,我不得不将它限制在过去两天的数据量内,这样它现在只运行了极小的6分54秒,但它返回了正确的数据。再次感谢您。如果性能是一个问题,您应该尝试LEAD选项,根据您需要的进一步连接和分区进行调整。大量记录可能会更有效。当然,猜测总是一种不好的调优方式。至于Oracle 8i,它有点复杂,我们的法国it团队有一个法国it团队,这可能是问题的基础,他的数据库是Oracle 11g Enterprise,但该数据库位于法国,我在英国,通过Citrix网络连接到它。我使用AquaData对数据库运行SQL命令,正是AquaData将我的命令限制为仅用于Oracle 8i的命令。我得到的基本答案是,今年晚些时候,当一些正在进行的项目完成时,我们将升级AquaData,我对旧Oracle SQL命令的探索将结束。至于SQL本身,这只是我自己的模糊尝试。它似乎将返回的值限制为GPS点之间发生的活动,以及相应的GPS数据。我所寻找的是所有的GPS点和相应的最后行动。第二个答案实现了这一点。我确实喜欢这样一个事实,那就是我似乎在沿着正确的路线思考,只是没有走到最后。谢谢你的帮助。因为我提供了一个与你发布的确切数据和输出相匹配的解决方案,所以对我的评价似乎有点苛刻。