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

Posted

技术标签:

【中文标题】嵌套表表达式不适用于 db2 z/OS【英文标题】:Nested Table Expression not working for db2 z/OS 【发布时间】:2021-02-17 20:13:00 【问题描述】:

以下查询在 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]:非法符号“,”。一些可能合法的符号是:在 CARDINALITY OVER 内)。 SQLCODE=-104, SQLSTATE=42601, DRIVER=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, DRIVER=3.72.24

知道我应该改变什么才能让它工作吗?

【问题讨论】:

VALUES 语句在 Db2-for-Z/OS 中尚不可用,因此请替换为对 sysibm.sysdummy1 或临时表的查询。 【参考方案1】:

当前发布的 Db2-for-Z/OS 版本没有像其他 Db2 平台已有的 VALUES 子句。

Db2-for-Z/OS 有一个名为 sysibm.sysdummy1 的单行表,有些人使用它。

但是,如果您可以引用临时表而不是 sysibm.sysdummy1,那么代码看起来更简洁。

在 Db2 for Z/OS 上运行语句的一种尴尬方式(存在其他方式)是使用联合 sysibm.sysdummy1 中的行的 CTE, (如果合适,在子查询中使用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;

【讨论】:

以上是关于嵌套表表达式不适用于 db2 z/OS的主要内容,如果未能解决你的问题,请参考以下文章

DB2 Z/OS:查找表中缺失的数据

DB2 z/OS - 为现有表创建表别名/同义词,指向其他现有表

在 DB2 for Z/OS 中创建表分区

在 Z/OS 上的 db2 的 JDBC URL 中设置默认表空间?

查询以选择具有特定最后一列的所有表 Ibm Db2 z/os

DB2 表的访问日期