如何连接表A到B以查找A中的所有条目,其间隔包含B中的条目?

时间:2014-05-01 21:49:47

标签: sql ms-access ms-access-2010

我正在比较日志条目间隔的两个表AB,即表中的每个记录是第一个日志条目,然后是给定用户的另一个,如下所示:

+--------+----------+--------+-----------+--------+
| userID |  date1   | logID1 |   date2   | logID2 |
+--------+----------+--------+-----------+--------+
|    235 | 1/3/2013 |     45 | 1/7/2013  |     48 |
|    235 | 4/6/2013 |     64 | 4/12/2013 |     73 |
|    462 | 1/4/2013 |     40 | 1/16/2013 |     50 |
+--------+----------+--------+-----------+--------+

我想构建一个连接查询,根据AB中的每条记录链接到userID中的所有记录,其中A包含B在任何一个日期:

a.date1<=b.date1, a.date2>=b.date2

或ID:

a.logID1<=b.logID1, a.logID2>=b.logID2

我想返回A中的所有记录,无论B中是否包含间隔。

乍一看,这似乎有用:

select * from a
left join b
on
a.userID=b.userID
where
(a.date1<=b.date1 or a.logID1<=b.logID1)
and
(a.date2>=b.date2 or a.logID2>=b.logID2)
or
b.userID is null

但问题是如果A中的记录在userID中匹配BA记录中不包含B }记录,将发生连接,但记录将被WHERE条件过滤掉,因此A记录不会出现在结果中。

如果我尝试通过将WHERE条件移动到JOIN子句来解决此问题,如下所示:

select * from a
left join b
on
a.userID=b.userID
and
(a.date1<=b.date1 or a.logID1<=b.logID1)
and
(a.date2>=b.date2 or a.logID2>=b.logID2)

然后我收到此错误消息:

JOIN expression not supported.

我认为这意味着Access无法在JOIN标准中嵌套OR条件。

我该怎么做才能返回A的列表,并在适用的情况下加入其所包含的B

1 个答案:

答案 0 :(得分:1)

如果您想要a中的所有记录,请将条件放在on子句中。 where有奇怪的效果。所以试试:

select *
from a left join
     b
     on a.userID = b.userID and
        (a.date1<=b.date1 or a.logID1<=b.logID1)
        (a.date2>=b.date2 or a.logID2>=b.logID2);