【问题标题】:using WHERE clause in inline view/derived table在内联视图/派生表中使用 WHERE 子句
【发布时间】:2021-11-04 04:52:50
【问题描述】:

我有查询,受qualify in oracle 启发,从我的表中选择唯一的活跃用户。 查询看起来像这样

SELECT
    COUNT(ID)
FROM
    (
        SELECT  MB.*
                ,ROW_NUMBER ()
                    OVER (PARTITION BY ID ORDER BY registered_date_time DESC)
                LATEST_DATE
        FROM TBL_ID MB
     ) A
WHERE 
    LATEST_DATE = 1
AND ID_STATUS = 'Active' 
AND UPPER(PROFILE_RULE) IN ('Allow 1','Allow 2')

运行这个查询我得到一个计数。从优化查询的角度来看,我尝试将WHERE 子句移到内联视图中,查询看起来像这样

SELECT
    COUNT(ID)
FROM
    (
        SELECT  MB.*
                ,ROW_NUMBER ()
                    OVER (PARTITION BY ID ORDER BY registered_date_time DESC)
                LATEST_DATE
        FROM TBL_ID MB
        WHERE
                ID_STATUS = 'Active' 
        AND UPPER(PROFILE_RULE) IN ('Allow 1','Allow 2')
     ) A
WHERE 
    LATEST_DATE = 1

但现在我得到了不同的计数。我假设我遗漏了任何细节或者这是预期的行为?据我了解,这不应该影响结果数据集。如有错误请指正。

【问题讨论】:

    标签: sql database oracle


    【解决方案1】:

    第一个查询:您正在为表中的所有条记录计算latest_date。然后你计算那些latest_date = 1 并满足其他where 条件的人。

    第二个查询:您正在获取满足 WHERE 条件的行,并从该记录池中计算 latest_date。然后,在主查询中,您只计算 latest_date = 1 的行。


    那么,它们为什么不同呢?因为第一个查询的latest_date 不必属于活动 状态或指定配置文件规则,而是这些值的一些其他组合。这意味着您已经从结果中排除了某些行。

    【讨论】:

    • 如果用例要求只计算落入这些 WHERE 过滤器的那些,哪个查询会得到所有记录?我很困惑从中做出直觉
    • 在我看来,第二个查询作为其子查询适用于您感兴趣的记录。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-30
    • 2013-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多