首页 > 解决方案 > 仅用于过滤某些类型的列的附加条件

问题描述

这是我的用例:我想过滤掉一个条件下的所有记录,另外过滤掉其他条件下的一些记录。

已编辑

这是两个条件:

  1. 所有记录必须满足条件created_at > SYSDATE + 30
  2. 来自表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;

这是我的架构(简化):

在此处输入图像描述

我的查询是否符合预期?可以重写以使其更快吗?如果是这样,怎么做?

标签: sqloracle

解决方案


我认为这就是你想要的:

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)


推荐阅读