查询重叠范围的两个表

时间:2017-02-04 16:36:40

标签: sql ms-access

我在Access 2007中有两个表,每个表定义一个ValueFrom和ValueTo列来表示一个范围,例如从1到10或从7到15。

我试图弄清楚如何发出一个返回两个表中重叠范围的查询。我觉得我错过了一些东西......

鉴于这两个表:

Table01
ValueFrom   ValueTo
1           10
5           15
25          50
500         600

Table02
ValueFrom   ValueTo
1           12
16          24
30          40
45          100
500         600

我希望这是输出

RESULTS FROM QUERY
Table01_ValueFrom   Table01_ValueTo   Table02_ValueFrom   Table02_ValueTo
1                   10                1                   12
5                   15                <emptystring>       <emptystring>
25                  50                30                  40
25                  50                45                  100
500                 600               500                 600

上述结果表明表01中的1-10范围与表02中的1-12范围重叠;表01中的5-15范围与表02中的任何Table02范围不重叠。 2502范围与表02,30-40和45-100中的两行重叠。

请注意,此查询必须检测部分和全范围重叠。

关于这个的任何想法?可以使用psuedocode甚至就如何解决这个问题提出建议。虽然我可以编写一个程序来执行上述操作,但我尝试使用单个Access查询来解决。

谢谢!

1 个答案:

答案 0 :(得分:1)

在普通的SQL中,您可以将其作为JOIN

执行此操作
select t1.ValueFrom, t1.ValueTo, t2.ValueFrom, t2.ValueTo
from table01 as t1 left join
     table02 as t2
     on t1.ValueFrom <= t2.ValueTo and t1.ValueTo >= t2.ValueFrom;

不幸的是,MS Access不允许JOIN条件下的不等式。所以,这是另一种方式:

select t1.ValueFrom, t1.ValueTo, t2.ValueFrom, t2.ValueTo
from table01 as t1,
     table02 as t2
where t1.ValueFrom <= t2.ValueTo and t1.ValueTo >= t2.ValueFrom
union all
select t1.ValueFrom, t1.ValueTo, NULL, NULL
from table01 as t1
where not exists (select 1
                  from table02 as t2
                  where t1.ValueFrom <= t2.ValueTo and t1.ValueTo >= t2.ValueFrom
                 );