【问题标题】:Single Oracle SQL query with CTE produces "SELECT list inconsistent with GROUP BY" error使用 CTE 的单个 Oracle SQL 查询产生“SELECT list 与 GROUP BY 不一致”错误
【发布时间】:2016-09-13 15:03:45
【问题描述】:

我有一个只需要返回一行数据的 Oracle 查询(不幸的是,我不知道 DBMS 版本)。此外,它需要是单个 SELECT 查询,因此不允许临时表和参数声明。

首先,我使用 CTE 聚合除第一列之外的所有列的值,第一列用作 GROUP BY 条件。我需要在一行中显示所有这些值,这很有效(我在过滤后的 CTE 上使用 3 个 CROSS JOIN,连接三个单行数据集,从而产生一个单行数据集)。

如果我只运行 CTE(不是整个 CTE,只是其中的 SELECT),它可以工作并且不会产生错误。但是,如果我将这个 SELECT 语句包装在 WITH ... AS 结构中,则会出现错误 - Oracle SQL Developer。

这是 CTE:

WITH
FRUITDATASET AS (
    SELECT
        -- FROM HERE, ORACLE SQL DEVELOPER MARKS LINES AS ERRONEOUS
        FRUITTYPE,
        COUNT(LONDONFRESH) AS LONDONFRESH,
        COUNT(BERLINFRESH) AS BERLINFRESH,
        SUM(0) AS LONDONSTALE,
        SUM(0) AS BERLINSTALE
        -- FROM HERE, THE QUERY IS VALID AGAIN
    FROM
        [...]
    GROUP BY
        FRUITTYPE

    UNION ALL

    SELECT
        -- FROM HERE, THE ERROR HAPPENS AGAIN
        FRUITTYPE,
        SUM(0) AS LONDONFRESH,
        SUM(0) AS BERLINFRESH,
        COUNT(LONDONSTALE) AS LONDONSTALE,
        COUNT(BERLINSTALE) AS BERLINSTALE
        -- FROM HERE IT'S OKAY
    FROM
        [...]
    GROUP BY
        FRUITTYPE
)

这是我使用 CTE 的方式:

SELECT
    SUM(APPLES.LONDONFRESH) AS LONDONFRESHAPPLES,
    SUM(APPLES.BERLINFRESH) AS BERLINFRESHAPPLES,
    SUM(APPLES.LONDONSTALE) AS LONDONSTALEAPPLES,
    SUM(APPLES.BERLINSTALE) AS BERLINSTALEAPPLES,
    SUM(GRAPES.LONDONFRESH) AS LONDONFRESHGRAPES,
    SUM(GRAPES.BERLINFRESH) AS BERLINFRESHGRAPES,
    SUM(GRAPES.LONDONSTALE) AS LONDONSTALEGRAPES,
    SUM(GRAPES.BERLINSTALE) AS BERLINSTALEGRAPES
FROM
    DUAL

    CROSS JOIN FRUITDATASET APPLES
    ON APPLES.FRUITTYPE = 'APPLE'

    CROSS JOIN FRUITDATASET GRAPES
    ON GRAPES.FRUITTYPE = 'GRAPE'

当我从 SQL Developer 运行查询时,它仍然会运行,但如果我将它放入报告中,它会引发异常。我试过放

NULL AS LONDONFRESH
[...]
GROUP BY
    FRUITTYPE,
    NULL

但它仍然不起作用。你们能帮我看看这个查询有什么问题吗?

编辑: 我想我可能通过使用分析函数解决了这个问题:

WITH
FRUITDATASET AS (
    SELECT
        *
    FROM (
        SELECT
            DISTINCT FRUITTYPE,
            COUNT(LONDONFRESH) OVER(PARTITION BY FRUITTYPE) AS LONDONFRESH,
            COUNT(BERLINFRESH) OVER(PARTITION BY FRUITTYPE) AS BERLINFRESH,
            SUM(NULL) OVER(PARTITION BY FRUITTYPE) AS LONDONSTALE,
            SUM(NULL) OVER(PARTITION BY FRUITTYPE) AS BERLINSTALE
        FROM
            [...]
    )

    UNION ALL

    SELECT
        *
    FROM (
        SELECT
            DISTINCT FRUITTYPE,
            SUM(NULL) OVER(PARTITION BY FRUITTYPE) AS LONDONFRESH,
            SUM(NULL) OVER(PARTITION BY FRUITTYPE) AS BERLINFRESH,
            COUNT(LONDONSTALE) OVER(PARTITION BY FRUITTYPE) AS LONDONSTALE,
            COUNT(BERLINSTALE) OVER(PARTITION BY FRUITTYPE) AS BERLINSTALE
        FROM
            [...]
    )
)

目前我无法在服务器上查看此解决方案,但我会尽快发布答案。

【问题讨论】:

  • 抛出什么异常?谁抛出异常?
  • @SamuelRenold 报告引擎抛出 ORA-00973 不是单组组函数 java.sql.SQLSyntaxErrorException。

标签: sql oracle group-by common-table-expression


【解决方案1】:

显然将 CTE 包装到 SELECT * FROM 中就可以了。现在一切正常。

【讨论】:

  • 奇怪,但真实
猜你喜欢
  • 1970-01-01
  • 2014-12-17
  • 2012-10-31
  • 1970-01-01
  • 2022-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多