在 SQL 中使用左反连接

问题描述 投票:0回答:2

我有一个像(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

请随意建议除反加入之外的任何方法。 谢谢!

sql join google-bigquery anti-join
2个回答
1
投票

您可以使用

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
)

0
投票

使用 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

© www.soinside.com 2019 - 2024. All rights reserved.