我正在比较日志条目间隔的两个表A
和B
,即表中的每个记录是第一个日志条目,然后是给定用户的另一个,如下所示:
+--------+----------+--------+-----------+--------+
| 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 |
+--------+----------+--------+-----------+--------+
我想构建一个连接查询,根据A
将B
中的每条记录链接到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
中匹配B
但A
记录中不包含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
?
答案 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);