我有一个由两个表组成的邻接表:
CREATE TABLE permission (id SMALLINT AUTO_INCREMENT(-32768, 1) PRIMARY KEY);
CREATE TABLE permission_graph (parent_id SMALLINT NOT NULL, child_id SMALLINT NOT NULL,
UNIQUE KEY (parent_id, child_id),
FOREIGN KEY (parent_id) REFERENCES permission(id) ON DELETE CASCADE,
FOREIGN KEY (child_id) REFERENCES permission(id) ON DELETE CASCADE);
当我运行以下CTE时,我得到一个空集:
WITH RECURSIVE cte (parent_id, child_id)
AS
(
(
SELECT anchor.parent_id, anchor.child_id
FROM permission_graph anchor
WHERE anchor.child_id = -32763
)
UNION ALL
(
SELECT recursive.parent_id, recursive.child_id
FROM cte, permission_graph recursive
WHERE recursive.child_id = cte.child_id
)
)
SELECT cte.parent_id, cte.child_id
FROM cte
但是如果我运行锚点条件:
SELECT anchor.parent_id, anchor.child_id
FROM permission_graph anchor
WHERE anchor.child_id = -32763
我得到:
[parent_id = -32767, child_id = -32763]
[parent_id = -32768, child_id = -32763]
当锚点结果非空时,为什么 CTE 返回一个空集?CTE 结果不应该包含锚点结果吗?
我想到了。(向那些试图帮助我的人道歉。你们不可能想出这个。)
经过大量实验后,我注意到动态查询 (
Connection.createStatement()
) 正在返回结果,但参数化查询 (Connection.prepareStatement()
) 正在返回一个空集。您无法知道这一点,因为我的问题错误地将查询列为:而实际上它是一个
PreparedStatement
值为
-32763
.在 H2 的发行说明的深处,我遇到了这个美妙的句子:
简而言之,这看起来像是一个 H2 限制/错误。我真的希望 H2 会抛出异常而不是返回一个空集。
https://groups.google.com/d/msg/h2-database/OJfqNF_Iqyo/Z748UP7W3NAJ确认了这个问题(我得到一个空集而不是空集,但问题描述是相同的)。
感谢那些尝试提供帮助的人!