在 T-SQL 中,我可以执行以下操作:
SELECT *
FROM (SELECT 1 AS n UNION ALL SELECT 2 AS n) AS t;
在 IBM DB2 SQL 中,这会失败并显示:
[IBM][System i Access ODBC 驱动程序][DB2 for i5/OS]SQL0199 - 不需要关键字 UNION。有效令牌: , FROM INTO。
SELECT
声明似乎需要一个子句FROM
。事实上,一个简化的 SQL 语句,例如:
SELECT 1 AS n
还有错误:
[IBM][System i Access ODBC 驱动程序][DB2 for i5/OS]SQL0104 - 令牌无效。有效令牌: , FROM INTO。
有一个UNNEST 函数可以从数组创建行,但似乎数组必须已经由变量或参数之类的东西表示。
我知道我可以通过使用不可能的标准(例如 1 = 0)从任意表中执行操作来解决此问题SELECT
,但这似乎是一个愚蠢的要求。
那么如何在没有基础表的情况下构造行呢?
(关键词:理货表;派生表)
在询问 Db2 时,平台和版本很重要...
在这种情况下,您似乎正在运行 Db2 for IBM i(iSeries、AS/400)
您正在寻找的东西在 SQL 标准中被称为表值构造函数,它看起来像
VALUES (<row1>),(<row2>),(...)
在 Db2 for i(和我相信的 LUW)上,有几种方法......
但是,您似乎使用的是旧版本的 Db2 for i(v5?)我不记得该版本是否支持表值构造函数......
DB2 for i5 V5R4不支持将
VALUES
语句作为表引用,因此另一个答案中提供的示例在该版本中不起作用。但是,所有版本的 DB2 都提供了一个单行伪表SYSIBM.SYSDUMMY1
,可用于生成行: