我试图在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。