不能在Db2的标量子查询中使用CTE



我试图在DB2 LUW v11.5.4.0标量子查询中使用CTE,但这不起作用:

SELECT 1
FROM SYSIBM.dual
WHERE 1 IN (
WITH t (x) AS (SELECT 1 FROM SYSIBM.dual)
SELECT * FROM t
);

我得到这个错误:

SQL Error [42601]: An unexpected token "AS"被发现如下"1 IN (WITH t (x)"预期的令牌可能包括:"JOIN"…

SQLCODE=-104, SQLSTATE=42601, DRIVER=4.26.14

这能做到吗?有解决办法吗?

(这与这个问题类似,但不相同,它是关于派生表的,而不是标量子查询。)派生表在11.5.4.0版本中支持CTE)

似乎在11.5.4.0版本中,可以在派生表中使用cte,因此可以像下面这样模拟查询:

SELECT 1
FROM SYSIBM.dual
WHERE 1 IN (
SELECT *
FROM (
WITH t (x) AS (SELECT 1 FROM SYSIBM.dual)
SELECT * FROM t
) t
);

但是,这个解决方法在旧版本的Db2中也不起作用,例如在v11.1.4.4版本中,可以从这个dbfiddle或这个问题中看到。这些版本中的解决方法是将CTE推到查询的顶层:

WITH t (x) AS (SELECT 1 FROM SYSIBM.dual)
SELECT 1
FROM SYSIBM.dual
WHERE 1 IN (
SELECT * FROM t
);

边注

HSQLDB似乎也有类似的限制/bug,参见https://sourceforge.net/p/hsqldb/bugs/1617。

最新更新