在SQL中使用左抗加入
我有一个会话表,例如(Table1):
会话ID | 发送者ID | 日期 |
---|---|---|
S1 | S1 S1 | 2020-10-02 |
S2 | S1 | S2 S1 2020-10-06 |
S3 | S2 S2 | 2020-03-01 |
S4 | S4 S2 | 2020-03-03-02 |
S3 | 事件 | 2020-08--08- 02 |
S6 | S4 | 2020-02-02 |
和交易表(Table2)类似:
交易ID | 发件人ID | 发送日期 |
---|---|---|
T1 | S1 S1 | 2020-10-01 |
T2 | S1 | 2020-10-05 |
T3 | S2 S2 | 2020-04-04-01 |
T4 | S3 | 2020-07-07--07--07--07--07--07--07- 02 |
T5 | S4 | 2020-12-12 |
我想生成一个表,该表仅包含在会话日期之前未进行任何交易的用户的会话。根据上表,我想返回:
会话ID | 发件人ID | 事件日期 |
---|---|---|
S3 | S2 | 2020-03-01 |
S4 | S2 | 2020-03-02 |
S6 S6 | S4 | 2020-02-02 |
我想使用反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
请随时提出除反加入以外的任何方法。 谢谢!
I have a session table like (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 |
And a transactions table (table2) like:
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 |
I want to generate a table that only contains the sessions of the users who have not made any transaction before their session date. According to the above tables, I want to return:
session ID | sender ID | event date |
---|---|---|
s3 | s2 | 2020-03-01 |
s4 | s2 | 2020-03-02 |
s6 | s4 | 2020-02-02 |
I want to solve this using Anti-Join. Would the below code work for this purpose?
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
Please feel free to suggest any method other than anti-join.
Thanks!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
您可以使用
存在
如:You can use
EXISTS
as in:除
外,
条款除外,我们还可以达到相同的结果:With
except
clause, we can also achieve the same result: