在 SQL 中使用 Left Anti Join
Using Left Anti Join in SQL
我有一个会话 table 喜欢 (table1):
session ID
sender ID
event date
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
还有一笔交易 table (table2) 例如:
transaction ID
sender ID
send date
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
我想生成一个 table,其中仅包含在会话日期之前未进行任何交易的用户的会话。根据上面的tables,我要return:
session ID
sender ID
event date
s3
s2
2020-03-01
s4
s2
2020-03-02
s6
s4
2020-02-02
我想使用 Anti-Join 解决这个问题。以下代码是否适用于此目的?
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
)
我有一个会话 table 喜欢 (table1):
session ID | sender ID | event date |
---|---|---|
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 |
还有一笔交易 table (table2) 例如:
transaction ID | sender ID | send date |
---|---|---|
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 |
我想生成一个 table,其中仅包含在会话日期之前未进行任何交易的用户的会话。根据上面的tables,我要return:
session ID | sender ID | event date |
---|---|---|
s3 | s2 | 2020-03-01 |
s4 | s2 | 2020-03-02 |
s6 | s4 | 2020-02-02 |
我想使用 Anti-Join 解决这个问题。以下代码是否适用于此目的?
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
)