如何在 IBM DB2 SQL 中創建沒有基礎表的行?
在 T-SQL 中,我可以執行以下操作:
SELECT * FROM (SELECT 1 AS n UNION ALL SELECT 2 AS n) AS t;
在 IBM DB2 SQL 中,這會失敗並顯示:
$$ IBM $$$$ System i Access ODBC Driver $$$$ DB2 for i5/OS $$SQL0199 - 不需要關鍵字 UNION。有效令牌: , FROM INTO。
SELECT
聲明似乎需要一個子句FROM
。事實上,一個簡化的 SQL 語句,例如:SELECT 1 AS n
還有錯誤:
$$ IBM $$$$ System i Access ODBC Driver $$$$ DB2 for i5/OS $$SQL0104 - 令牌無效。有效令牌: , FROM INTO。
有一個UNNEST 函式可以從數組創建行,但似乎數組必須已經由變數或參數之類的東西表示。
我知道我可以通過使用不可能的標準(例如 1 = 0)從任意表中執行操作來解決此問題
SELECT
,但這似乎是一個愚蠢的要求。那麼如何在沒有基礎表的情況下構造行呢?
(關鍵詞:理貨表;派生表)
DB2 for i5 V5R4不支持將
VALUES
語句作為表引用,因此另一個答案中提供的範例在該版本中不起作用。但是,所有版本的 DB2 都提供了一個單行偽表SYSIBM.SYSDUMMY1
,可用於生成行:SELECT 1 AS n FROM SYSIBM.SYSDUMMY1 UNION ALL SELECT 2 AS n FROM SYSIBM.SYSDUMMY1
在詢問 Db2 時,平台和版本很重要…
在這種情況下,您似乎正在執行 Db2 for IBM i(iSeries、AS/400)
您正在尋找的東西在 SQL 標準中被稱為表值建構子,它看起來像
VALUES (<row1>),(<row2>),(...)
在 Db2 for i(和我相信的 LUW)上,有幾種方法……
-- Using a Common Table Expression (CTE) WITH X(foo, bar, baz) AS ( VALUES (0, 1, 2), (3, 4, 5), (6, 7, 8) ) SELECT * FROM X; -- Using a Nested Table Expression (NTE) SELECT * FROM TABLE ( VALUES (0, 1, 2), (3, 4, 5), (6, 7, 8) ) X(foo, bar, baz);
但是,您似乎使用的是舊版本的 Db2 for i(v5?)我不記得該版本是否支持表值建構子……