我有一个像(table1)这样的会话表:
会话ID | 发件人ID | 活动日期 |
---|---|---|
s1 | s1 | 2020-10-02 |
s2 | s1 | 2020-10-06 |
s3 | s2 | 2020-03-01 |
s4 | s2 | 2020-03-02 |
s5 | s3 | 2020-08-02 |
s6 | s4 | 2020-02-02 |
还有一个交易表(table2),例如:
交易ID | 发件人ID | 发送日期 |
---|---|---|
t1 | s1 | 2020-10-01 |
t2 | s1 | 2020-10-05 |
t3 | s2 | 2020-04-01 |
t4 | s3 | 2020-07-02 |
t5 | s4 | 2020-12-12 |
我想生成一个表,其中仅包含在会话日期之前未进行任何交易的用户的会话。根据上表,我要退货:
会话ID | 发件人ID | 活动日期 |
---|---|---|
s3 | s2 | 2020-03-01 |
s4 | s2 | 2020-03-02 |
s6 | s4 | 2020-02-02 |
我想使用反连接来解决这个问题。下面的代码可以用于此目的吗?
SELECT *
FROM table1 t1
LEFT JOIN table2 t2
ON t2.sender_id = t1.sender_id
AND t2.event_date > t1.event_date
WHERE t2.sender_id IS NULL
请随意建议除反加入之外的任何方法。 谢谢!
您可以使用
EXISTS
,如下所示:
select *
from t1
where not exists (
select 1
from t2
where t2.sender_id = t1.sender_id and t2.send_date < t1.event_date
)
使用 except 子句我们也会得到相同的结果 从会话表中选择 * 除了 从 sessiontbl t1 中选择 t1.session_id、t1.sender_id、t1.event_date 内连接事务tbl t2 上 t1.sender_id = t2.sender_id 其中 t1.event_date > t2.send_date