嵌套表表达式不适用于 db2 z/OS

问题描述

以下查询在 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;