什么是随时间查找行的简单而有效的方法

我有两张表,都有开始时间和结束时间字段。 我需要为第一个表中的每一行查找第二个表中时间间隔相交的所有行。

例如:

           <-----row 1 interval------->
<---find this--> <--and this--> <--and this-->

请以SQL WHERE clause的形式短语回答,并考虑第二个表中的结束时间可能为NULL

目标平台是SQL Server 2005,但来自其他平台的解决方案可能也是有用的。


SELECT * 
FROM table1,table2 
WHERE table2.start <= table1.end 
AND (table2.end IS NULL OR table2.end >= table1.start)

select * from table_1 
right join 
table_2 on 
(
table_1.start between table_2.start and table_2.[end]
or
table_1.[end] between table_2.start and table_2.[end]
or
(table_1.[end] > table_2.start and table_2.[end] is null)
)

编辑:好吧,不要为我的解决方案,它的演出像狗屎。 “哪里”解决方案速度快14倍。 糟糕!

一些统计数据:在表1和表2中运行〜65000条记录(无索引),每行在开始和结束之间的间隔为2天,在SQLSMSE中运行2分钟(没有耐心等待)

在2分钟内使用连接:8356行

使用地点:2分钟内115436行


这听起来很复杂,直到你开始反向工作。 下面我说明了只有好的情况(没有重叠)! 由这两个简单条件定义,如果condA或condB为TRUE,我们没有重叠范围,所以我们要反转这些:非condA而不是CondB,在我们的例子中,我只是将符号颠倒了(>变成了<=)

/*
|--------| A                             ___  CondA: b.ddStart >  a.ddEnd
            |=========| B                /      ____ CondB:  a.ddS >  b.ddE
                          |+++++++++| A         /
*/
--DROP TABLE ran
create table ran ( mem_nbr int, ID int, ddS date, ddE date)
insert ran values  
(100, 1,  '2012-1-1','2012-12-30'),    ---- ovl
(100, 11, '2012-12-12','2012-12-24'),  ----/
(100, 2, '2012-12-31','2014-1-1'),
(100, 3, '2014-5-1','2014-12-14') ,

(220, 1, '2015-5-5','2015-12-14') ,    ---ovl
(220, 22, '2014-4-1','2015-5-25') ,    ---/
(220, 3, '2016-6-1','2016-12-16')  

select  DISTINCT a.mem_nbr ,  a.* , '-' [ ], b.dds, b.dde, b.id 
FROM ran a
join ran b  on  a.mem_nbr = b.mem_nbr          -- match by mem#
               AND     a.ID <> b.ID            -- itself
                  AND     b.ddS <= a.ddE        -- NOT    b.ddS >  a.ddE       
                  AND     a.ddS <= b.ddE        -- NOT    a.ddS >  b.ddE   
链接地址: http://www.djcxy.com/p/54403.html

上一篇: What is a simple and efficient way to find rows with time

下一篇: Determine if two rectangles overlap each other?