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 (使用这个提示:
select /*+ no_query_transformation */
max(col1), max(col2)
from ( ....
没有它,Oracle 优化器将尝试猜测您的意图并重新编写 sql 以获得更好的性能。
对于使用像这样的内联性能视图的复杂查询,它通常会做出错误的猜测。
【讨论】:
以上是关于SQL MAX 函数奇怪的行为的主要内容,如果未能解决你的问题,请参考以下文章