Db2

如何在 IBM DB2 SQL 中創建沒有基礎表的行?

  • March 9, 2019

在 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?)我不記得該版本是否支持表值建構子……

引用自:https://dba.stackexchange.com/questions/231709