SQL MAX 函数奇怪的行为

Posted

技术标签:

【中文标题】SQL MAX 函数奇怪的行为【英文标题】:SQL MAX function strange behaviour 【发布时间】:2014-09-01 08:06:52 【问题描述】:

***,你好。 有以下问题。 假设有一个返回以下内容的查询:

当我尝试“select max(col1), max(col2)”时,它返回我:

当我尝试“select max(col2),max(col1)”时,它会返回:

您对这里发生的事情有任何想法吗?

给出问题的查询是

select max(col2),max(col1)
from (

SELECT 
        NVL(IS_IN_OPEN_BR, 0)                             AS col1,
        NVL(IS_IN_OPEN_ISR, 0)                            AS col2
      FROM
        (
        SELECT DISTINCT PRD_DEV_CODE AS DEV_CODE_ISR,
          PRD_GRP_CODE               AS GRP_CODE_ISR,
          1                          AS IS_IN_OPEN_ISR
        FROM ATL_ADM.PRODUCT PRD
        INNER JOIN ATL_ADM.SB_REQ SR
        ON PRD.PRD_ID = SR.SBR_PRD_ID
        INNER JOIN ATL_ADM.LIB_REPLENISH_REQ LSR
        ON LSR.LSR_ID         = SR.SBR_LSR_ID
        WHERE LSR.LSR_STATUS <> 'CLOSED'
        GROUP BY PRD_DEV_CODE,
          PRD_GRP_CODE
        ) ISR
      FULL OUTER JOIN
        (
        SELECT DISTINCT PRD.PRD_DEV_CODE DEV_CODE_SHIP,
          PRD.PRD_GRP_CODE AS GRP_CODE_SHIP,
          NVL( MAX (SHP.SHIP_SHIPDATE), MAX (SHP.SHIP_UPDDATET)) LAST_SHIP_DATE
        FROM ATL_ADM.SB_REQ SR
        JOIN ATL_ADM.SHIPMENT SHP
        ON SR.SBR_ID = SHP.SHIP_SBR_ID
        JOIN ATL_ADM.PRODUCT PRD
        ON PRD.PRD_ID        = SR.SBR_PRD_ID
        WHERE SR.SBR_TYPE    = 'FLA'
        AND SHP.SHIP_STATUS IN ('SHIPPE', 'MANDEV')
        GROUP BY PRD.PRD_DEV_CODE ,
          PRD.PRD_GRP_CODE
        ) SHIPS ON DEV_CODE_ISR = DEV_CODE_SHIP
      FULL OUTER JOIN
        (
            SELECT DISTINCT 
                PRODUCT.PRD_DEV_CODE  DEV_CODE_BR,
                PRODUCT.PRD_GRP_CODE GRP_CODE_BR,
                1 IS_IN_OPEN_BR
            FROM ATL_ADM.PRODUCT
            JOIN ATL_ADM.SB_REQ
            ON PRODUCT.PRD_ID = SB_REQ.SBR_PRD_ID
            JOIN ATL_ADM.REQT_SET
            ON REQT_SET.REQTS_ID = SB_REQ.SBR_RS_ID
            JOIN ATL_ADM.BRIEF
            ON BRIEF.BR_ID = REQT_SET.REQTS_BR_ID
            WHERE BRIEF.BR_STATUS_CODE NOT IN ('CLOSED', 'CANCEL')
            GROUP BY PRODUCT.PRD_GRP_CODE,
            PRODUCT.PRD_DEV_CODE,
            BRIEF.BR_STATUS_CODE
        ) BRS ON DEV_CODE_BR = DEV_CODE_SHIP)

【问题讨论】:

向我们展示 SQL 查询,我有 no problems 与它 除了 SQL 查询之外,能否请您提供一个完整的环境来演示此行为,包括表 DDL、插入语句和 SQL 查询。如果没有人能够重现,可能有人需要查看某些数据库参数。 我测试过,没有这样的结果 @Ben,我不能提供更多数据:( 你的数据库版本是多少?我已经看到优化器查询重写使用 FULL OUTER JOIN 查询的问题。当我们升级到 11.2 时,大部分问题都得到了修复。有时您可以通过执行 SELECT MAX(col2), MAX(col1) FROM (SELECT * FROM () WHERE ROWNUM >= 1) 之类的操作来避免优化器查询重写 【参考方案1】:

使用这个提示:

select /*+ no_query_transformation */
          max(col1), max(col2)
from  ( ....

没有它,Oracle 优化器将尝试猜测您的意图并重新编写 sql 以获得更好的性能。

对于使用像这样的内联性能视图的复杂查询,它通常会做出错误的猜测。

【讨论】:

以上是关于SQL MAX 函数奇怪的行为的主要内容,如果未能解决你的问题,请参考以下文章

没有 Group By 的 SQL MAX 函数行为

Firefox 基于 max-age 的缓存过期行为奇怪

奇怪的 Visual Studio 行为:执行时间很长

这种悲伤教学的奇怪行为的原因是啥?

最大高度的奇怪手风琴行为

特殊字符(夏威夷 'Okina)导致奇怪的字符串行为