【发布时间】:2021-08-29 07:47:12
【问题描述】:
查询:
SELECT
cin,
reviewDate,
kycStatus
FROM
(
SELECT
ppc.prty_idnt_num AS cin,
prty_sts_strt_dttm AS reviewDate,
prty_sts_cd AS kycStatus,
ROW_NUMBER()
OVER(PARTITION BY ps.prty_id
ORDER BY
prty_sts_strt_dttm DESC
) AS rownum
FROM
public.party_status ps
LEFT JOIN public.party_position_current ppc ON ppc.prty_id = ps.prty_id
WHERE
UPPER(prty_sts_clsn_cd) = 'KYC'
AND ppc.prty_idnt_num = :cin
) kyc
WHERE
rownum = 1 OR rownum IS NULL;
错误:
Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "SELECT CIN, REVIEWDATE, KYCSTATUS FROM ( SELECT PPC.PRTY_IDNT_NUM AS CIN, PRTY_STS_STRT_DTTM AS REVIEWDATE, PRTY_STS_CD AS KYCSTATUS, ROW_NUMBER() OVER(PARTITION BY PS.PRTY_ID ORDER BY PRTY_STS_STRT_DTTM DESC ) AS ROWNUM[*] FROM PUBLIC.PARTY_STATUS PS LEFT JOIN PUBLIC.PARTY_POSITION_CURRENT PPC ON PPC.PRTY_ID = PS.PRTY_ID WHERE UPPER(PRTY_STS_CLSN_CD) = 'KYC' AND PPC.PRTY_IDNT_NUM = ? ) KYC WHERE ROWNUM = 1 OR ROWNUM IS NULL"; expected "identifier"; SQL statement:
SELECT cin, reviewDate, kycStatus FROM ( SELECT ppc.prty_idnt_num AS cin, prty_sts_strt_dttm AS reviewDate, prty_sts_cd AS kycStatus, ROW_NUMBER() OVER(PARTITION BY ps.prty_id ORDER BY prty_sts_strt_dttm DESC ) AS rownum FROM PUBLIC.party_status ps LEFT JOIN PUBLIC.party_position_current ppc ON ppc.prty_id = ps.prty_id WHERE UPPER(prty_sts_clsn_cd) = 'KYC' AND ppc.prty_idnt_num = ? ) kyc WHERE rownum = 1 OR rownum IS NULL [42001-200]
查询在 DB (Teradata) 中运行良好,但在 H2(用作测试数据库)中失败。我无法弄清楚语法有什么问题。我怀疑row_number() 是罪魁祸首,但不确定。谁能帮忙解决这个问题?
【问题讨论】:
-
@TimBiegeleisen 添加了格式化查询
-
ppc.prty_idnt_num = :cin:cin是什么,H2是否支持命名参数? -
@TimBiegeleisen 是的,它确实如此。我已经在 h2 中使用命名参数测试了数百个查询,没有任何问题。
-
那个错误信息真的很模糊。我建议将您的查询分开并测试各个部分。首先尝试自己执行别名为
kyc的子查询。看看可能是什么错误。
标签: spring-boot h2 rownum