问题描述
以下查询在 DB2 LUW 中运行时有效。
SELECT
TEMP1.SINIESTRO,TEMP1.POLIZA
FROM TABLE(VALUES
('00000031955190','0107737793'),('00000118659978','0107828212'),('00000118978436','0095878120'),('00000122944473','0106845043')
) TEMP1(SINIESTRO,POLIZA);
当我尝试在 DB2 for z/OS 中使用它时,出现以下错误:
sql 错误 [42601]:非法符号“,”。一些可能合法的符号是:在基数范围内)。 sqlCODE=-104,sqlSTATE=42601,驱动程序=3.72.24
我也尝试过 CTE。
WITH X(foo,bar,baz) AS (
VALUES (0,1,2),(3,4,5),(6,7,8)
) SELECT * FROM X;
我得到这个错误:
sql 错误 [42601]:非法符号“X”。一些可能合法的符号是:DSN_INLINE_OPT_HINT。 sqlCODE=-104,sqlSTATE=42601,驱动程序=3.72.24
知道我应该改变什么才能让它工作吗?
解决方法
当前发布的 Db2-for-Z/OS 版本没有其他 Db2 平台已有的 VALUES 子句。
Db2-for-Z/OS 有一个名为 sysibm.sysdummy1
的单行表,有些人使用它。
但是,如果您可以引用临时表而不是 sysibm.sysdummy1
,那么代码看起来更简洁。
在 Db2 for Z/OS 上运行您的语句的一种笨拙方式(存在其他方式)是使用 CTE 来联合来自 sysibm.sysdummy1 的行,
(如果合适,请在子查询中使用 union all
):
with temp1 (SINIESTRO,POLIZA)
as
(
select '00000031955190','0107737793' from sysibm.sysdummy1
union
select '00000118659978','0107828212' from sysibm.sysdummy1
union
select '00000118978436','0095878120' from sysibm.sysdummy1
union
select '00000122944473','0106845043' from sysibm.sysdummy1
)
SELECT
TEMP1.SINIESTRO,TEMP1.POLIZA
FROM temp1;