SQL Developer 建议我将聚合添加到 group by 子句

Van*_*rat 5 oracle oracle-sql-developer

这实际上并不是一个错误,只是一个我想要一些解释的烦恼。我已经尝试过我的 Google-Fu,但我今天显然缺乏技能。

我正在使用 Oracle SQL Developer 4.1.5.21 Build MAIN-21.78 我曾经使用 2010 年的非常旧的版本(不记得版本号),并且它从未提出过这个建议,这让我感到困惑。

本质上,我有以下查询:

  SELECT
          STDT."Student_ID"
        , STDT."Study_Package_Code"
        , STDT."Availability_Year"
        , STDT.semester_agg AS "Semester"
        , MIN(STDT."Application_Date") AS APP_DATE
  FROM INT_COMMENCING_APPS STDT
  WHERE 1=1
  AND STDT."Availability_Year" >= 2017
  GROUP BY STDT."Student_ID"
        , STDT."Study_Package_Code"
        , STDT."Availability_Year"
        , STDT.semester_agg
Run Code Online (Sandbox Code Playgroud)

它运行良好,没有错误,并返回预期的数据。然而,甲骨文开发人员告诉我,我又蠢又错,应该去死……好吧,也许没那么糟糕。但它确实给了我一个查询提示,告诉我我错了:

SELECT list inconsistent with GROUP BY;
amend GROUP BY clause to:
          STDT."Student_ID"
        , STDT."Study_Package_Code"
        , STDT."Availability_Year"
        , STDT.semester_agg
        , MIN(STDT."Application_Date")
Run Code Online (Sandbox Code Playgroud)

请注意它如何告诉我将聚合 MIN 函数添加到我的 GROUP BY 子句中,结果是什么?我已经编写 SQL 多年了,这是我第一次被告知要做这样的事情...坦率地说,我现在忽略 Oracle,因为它是个混蛋,无法礼貌地告诉我为什么。话虽这么说,如果有人有的话,我希望社区能给出解释。:)

谢谢!

编辑 2016 年 9 月 12 日

我刚刚注意到这个查询建议有一个模式。我上面没有提到的是上面的查询是在 CTE 内!因为……为什么这很重要,但显然确实如此。

在 CTE 之外,Oracle SQL Developer 并不关心聚合是否在 group by 子句中(无论如何它都不应该关心)。然而,一旦查询进入 CTE、BAM,它就会获得所有荷尔蒙并告诉我它想要巧克力......我的意思是它告诉我将聚合添加到 group by 子句中。

示例(如果我在查询中引用 CTE 也没关系):

WITH APPDT AS (
  SELECT /*+ materialize */
          STDT."Student_ID"
        , STDT."Study_Package_Code"
        , STDT."Availability_Year"
        , STDT.semester_agg AS "Semester"
        , MIN(STDT."Application_Date") AS APP_DATE--<=this aggregate
        --SQL Developer tells me to add the aggregate to the
        --GROUP BY clause below
  FROM INT_COMMENCING_APPS STDT
  WHERE 1=1
  AND STDT."Availability_Year" >= 2017
  GROUP BY STDT."Student_ID"
        , STDT."Study_Package_Code"
        , STDT."Availability_Year"
        , STDT.semester_agg
)

  SELECT
          STDT."Student_ID"
        , STDT."Study_Package_Code"
        , STDT."Availability_Year"
        , STDT.semester_agg AS "Semester"
        , MIN(STDT."Application_Date") AS APP_DATE--<=this aggregate
        --SQL Developer doesn't tell me to add the aggregate
        --to the GROUP BY clause below
  FROM INT_COMMENCING_APPS STDT
  WHERE 1=1
  AND STDT."Availability_Year" >= 2017
  GROUP BY STDT."Student_ID"
        , STDT."Study_Package_Code"
        , STDT."Availability_Year"
        , STDT.semester_agg
Run Code Online (Sandbox Code Playgroud)

ype*_*eᵀᴹ 3

看起来像是您使用的特定版本的 SQL Developer (4.1.5.21)(的解析器)中的错误。

更新到最新版本,如果显示相同的行为,请向 Oracle 发送错误报告。

您可以尝试找到一个较小的示例(如下所示,如果它确实表现出相同的错误建议):

CREATE TABLE t
  ( a INT NOT NULL, 
    b DATE NOT NULL
  ) ;

-- no suggestions
SELECT /*+ materialize */ a, MIN(b) AS min_b
FROM t
GROUP BY a ;

-- buggy suggestions
WITH ct AS
  ( SELECT /*+ materialize */ a, MIN(b) AS min_b
    FROM t
    GROUP BY a 
  ) 
SELECT * 
FROM ct ;
Run Code Online (Sandbox Code Playgroud)