H2数据库:在CTE中使用窗口功能时出错

问题描述

使用H2数据库(1.4.200版),在CTE中使用窗口函数时遇到了非常奇怪的错误。当我将窗口函数字段包含到CTE中并且OVER()子句为空时,它可以正常工作,但是当我尝试在ORDER BY/PARTITION BY子句中添加OVER()时,遇到了以下错误:'[42000][42000] Syntax error in SQL statement "WITH statement supports only SELECT,TABLE,VALUES,CREATE TABLE,INSERT,UPDATE,MERGE or DELETE statements" ' 非工作代码示例:

WITH cte AS( 
  SELECT ROW_NUMBER() OVER (PARTITION BY CUST_NAME ORDER BY ORDER_DATE) AS rn 
  FROM TEST.HOLDING
)    
SELECT * 
FROM cte

一个澄清:当我使用不在CTE内的带有PARTITION BY \ ORDER BY部件的Windows函数运行语句时,它运行良好。 工作代码示例:

SELECT ROW_NUMBER() OVER (PARTITION BY CUST_NAME ORDER BY ORDER_DATE) AS rn 
FROM TEST.HOLDING

该问题的测试案例:

CREATE TABLE PUBLIC.HOLDING(
CUST_NAME VARCHAR(50),ORDER_DATE DATE
);

INSERT INTO PUBLIC.HOLDING(CUST_NAME,ORDER_DATE)
VALUES('Customer1',TO_DATE('20200201','YYYYMMDD')),('Customer1',TO_DATE('20200202',('Customer2','YYYYMMDD'));

WITH cte AS(
SELECT CUST_NAME,ORDER_DATE,ROW_NUMBER() OVER (PARTITION BY CUST_NAME ORDER BY ORDER_DATE) AS rn
FROM PUBLIC.HOLDING
)

SELECT *
FROM cte;

SELECT CUST_NAME,ROW_NUMBER() OVER (PARTITION BY CUST_NAME ORDER BY ORDER_DATE) AS rn
FROM PUBLIC.HOLDING;

解决方法

您应该告诉我们您使用哪个数据库。如果您使用sql server,请检查代码,是否在'with'前面,是否有';'。

;WITH cte AS( 
  SELECT ROW_NUMBER() OVER (PARTITION BY CUST_NAME ORDER BY ORDER_DATE) AS rn 
  FROM TEST.HOLDING
)    
SELECT * 
FROM cte;

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...