Sql 仅用于对某些类型的列进行筛选的附加条件

Sql 仅用于对某些类型的列进行筛选的附加条件,sql,oracle,Sql,Oracle,下面是我的用例:我想在一个条件下过滤掉所有记录,并在附加条件下过滤掉一些记录 已编辑 以下是两个条件: 所有记录必须满足在SYSDATE+30创建的条件 表用户中具有(共享)与表黑名单中相同id的记录(join on u.id=b.id),其中列端点等于XYZ,必须将列延迟到符合标准比现在更早的。如果端点不等于XYZ,则仅应用第1个条件 我提出了以下问题: SELECT * users u left join blacklist b ON u.id = b.id AND

下面是我的用例:我想在一个条件下过滤掉所有记录,并在附加条件下过滤掉一些记录

已编辑

以下是两个条件:

  • 所有记录必须满足在SYSDATE+30创建的条件
  • 用户中具有(共享)与表黑名单中相同id的记录(
    join on u.id=b.id
    ),其中列端点等于
    XYZ
    ,必须将列延迟到符合标准
    比现在更早的
    。如果端点不等于
    XYZ
    ,则仅应用第1个条件
  • 我提出了以下问题:

    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;
    
    选择*users u
    左加入黑名单b
    在u.id=b.id上
    和b.延迟到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;
    
    选择*
    来自你加入的用户
    黑名单b
    在u.id=b.id和
    (b)延迟至SYSDATE+30;
    
    对于
    左联接
    而言,在
    on
    子句中的第一个表上进行筛选没有意义


    对于此查询,您需要
    用户(端点,创建时间,id)
    黑名单(id,延迟时间)上的索引

    此查询是否查找所有端点,而不仅仅是那些等于
    XYZ
    的端点。我希望查找所有端点。请查看我更新的问题并进行一些澄清。@menteith…我根据您的评论修改了查询。我想您只需要内部联接,而不是外部联接。谢谢。您能解释一下使用的原因吗ode>(b.delayed_until@menteith…我认为这实现了逻辑“其中列端点等于XYZ必须有列delayed_until”。