gpt4 book ai didi

sql - 带有子查询和组函数的可能的 Oracle 错误

转载 作者:行者123 更新时间:2023-12-04 08:32:46 26 4
gpt4 key购买 nike

谁能解释一下为什么下面的查询返回两行而不是一个?

SELECT *
FROM (SELECT 'ASDF' c1, MAX (SUM (1)) c2
FROM DUAL
GROUP BY dummy
UNION
SELECT 'JKLÖ' c1, 1 c2
FROM DUAL)
WHERE c1 != 'ASDF';

--another Version with the same wrong result:
SELECT *
FROM (SELECT 1 c1, MAX (SUM (1)) c2
FROM DUAL
GROUP BY dummy
UNION all
SELECT 2 c1, 1 c2
FROM DUAL)
WHERE c1 != 1;

Oracle 提供两行是否正确?在我看来,带有 c1 = ASDF 的行不应该出现在结果中。

这是第一个查询结果的屏幕截图:

enter image description here

我已经在以下版本上对其进行了测试,结果始终相同:
  • Oracle 数据库 11g 企业版 11.2.0.3.0 版 - 64 位生产版
  • Oracle Database 12c 企业版 12.1.0.2.0 版 - 64 位生产版
  • 最佳答案

    不,这不是错误。聚合函数是您看到这种意外结果的原因。下面是它的工作原理。 SUM()功能以及MAX()如果查询没有返回行,函数将返回 NULL(产生 1 行)。当您的查询执行时,优化器适用 predicate pushing转换和您的原始查询变为(不会发布整个跟踪,只发布转换后的查询):

    SELECT "from$_subquery$_001"."C1" "C1",
    "from$_subquery$_001"."C2" "C2"
    FROM (
    (SELECT 'ASDF' "C1",MAX(SUM(1)) "C2"
    FROM "SYS"."DUAL" "DUAL"
    WHERE 'ASDF'<>'ASDF' [1]-- predicate pushed into the view
    GROUP BY "DUAL"."DUMMY" )
    UNION
    (SELECT 'JKLÖ' "C1",
    1 "C2"
    FROM "SYS"."DUAL" "DUAL"
    WHERE 'JKLÖ'<>'ASDF')) "from$_subquery$_001"

    [1] 由于谓词推送您的第一个子查询不返回任何行,并且当聚合函数(除了 count 和其他一些)时, MAXSUM甚至两者都用于空结果集 NULL将返回 - 第二个子查询返回 1 行 + 1 行,从而生成您正在查看的 2 行结果集。

    下面是简单的演示:
    create table empty_table (c1 varchar2(1));

    select 'aa' literal, nvl(max(c1), 'NULL') as res
    from empty_table

    LITERAL RES
    ------- ----
    aa NULL

    1 row selected.

    关于sql - 带有子查询和组函数的可能的 Oracle 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40546638/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com