如何在PostgreSQL中使用交叉连接递归生成置换?

如何在PostgreSQL中使用交叉连接递归生成置换?,sql,postgresql,Sql,Postgresql,我试图在递归CTE中使用交叉连接来生成置换。但是,当我运行以下代码时: WITH RECURSIVE permute (n) AS ( SELECT ARRAY[a.*, b.*] FROM unnest(ARRAY[ARRAY[1], ARRAY[2], ARRAY[3]]) a CROSS JOIN unnest(ARRAY[1, 2, 3]) b UNION ALL SELECT ARRAY[a.n, ARRAY[b.*]] FROM unnest(ARRAY[1,

我试图在递归CTE中使用交叉连接来生成置换。但是,当我运行以下代码时:

WITH RECURSIVE permute (n) AS (
    SELECT ARRAY[a.*, b.*] FROM unnest(ARRAY[ARRAY[1], ARRAY[2], ARRAY[3]]) a
    CROSS JOIN unnest(ARRAY[1, 2, 3]) b
UNION ALL
    SELECT ARRAY[a.n, ARRAY[b.*]] FROM unnest(ARRAY[1, 2, 3]) b
    CROSS JOIN permute a 
)
SELECT * FROM permute 
我希望它能无限地生成组合。相反,我只得到初始的非递归结果:

"{1,1}"
"{1,2}"
"{1,3}"
"{2,1}"
"{2,2}"
"{2,3}"
"{3,1}"
"{3,2}"
"{3,3}"

至少可以说令人失望。我想在递归CTE中使用交叉连接来实现这一点,但我不确定我的方法失败的确切原因,或者是否可以修改它以使其工作。感谢您的帮助

以下命令在数组中生成置换:

WITH RECURSIVE permute  AS (
      SELECT ARRAY[v.n] as ar, 1 as lev
      FROM (VALUES (1), (2), (3)) v(n) 
      UNION ALL
      SELECT p.ar || v.n, lev + 1
      FROM permute p CROSS JOIN
           (VALUES (1), (2), (3)) v(n) 
      WHERE lev < 5
     )
SELECT p.ar
FROM (SELECT p.*, MAX(lev) OVER () as max_lev
      FROM permute p
     ) p
WHERE lev = max_lev;
根据需要的排列数量调整5


是一个dbfiddle。

这会像预期的那样给我造成错误,因为您正在尝试合并标量和数组。你能再描述一下你想做什么吗?例如,你想要的结果?谢谢,这很有道理!