sql - 仅用于过滤某些类型的列的附加条件
问题描述
这是我的用例:我想过滤掉一个条件下的所有记录,另外过滤掉其他条件下的一些记录。
已编辑
这是两个条件:
- 所有记录必须满足条件
created_at > SYSDATE + 30
- 来自表users的记录(共享)与表blacklist ( ) 中的id 相同,
join on u.id = b.id
其中列端点等于XYZ
必须具有符合条件的列delayed_untilolder than now
。如果端点不等于XYZ
,则仅适用第一个条件。
我想出了以下查询:
SELECT * users u
left join blacklist b
ON u.id = b.id
AND b.delayed_until < SYSDATE
AND u.endpoint = 'XYZ'
WHERE u.created_at > SYSDATE + 30;
这是我的架构(简化):
我的查询是否符合预期?可以重写以使其更快吗?如果是这样,怎么做?
解决方案
我认为这就是你想要的:
SELECT *
FROM users u JOIN
blacklist b
ON u.id = b.id AND
(b.delayed_until <= SYSDATE OR
u.endpoint <> 'XYZ'
)
WHERE u.created_at > SYSDATE + 30;
过滤ON
子句中的第一个表没有意义LEFT JOIN
。
对于此查询,您需要 和 上的users(endpoint, created_at, id)
索引blacklist(id, delayed_until)
。