【发布时间】: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