PostgreSQL连接以使用generate_系列对表进行非规范化

PostgreSQL连接以使用generate_系列对表进行非规范化,postgresql,join,denormalization,generate-series,Postgresql,Join,Denormalization,Generate Series,我有这张桌子: CREATE TABLE "mytable" ( name text, count integer ); INSERT INTO mytable VALUES ('john', 4),('mark',2),('albert',3); 我想用这种方式取消行的规范化: SELECT name FROM mytable JOIN generate_series(1,4) tmp(a) ON (a<=count) 所以我有很多行,每个名字等于count列:我有4行和john

我有这张桌子:

CREATE TABLE "mytable"
(  name text,  count integer );
INSERT INTO mytable VALUES ('john', 4),('mark',2),('albert',3);
我想用这种方式取消行的规范化:

SELECT name FROM mytable JOIN generate_series(1,4) tmp(a) ON (a<=count)
所以我有很多行,每个名字等于count列:我有4行和john在一起,2行和mark在一起,3行和albert在一起。 但是如果我不知道在这个例子4中的最高计数,我就不能使用generate_series函数。有没有一种方法可以在不知道MAXcount的情况下执行此操作

select name, 
       generate_series(1,count)
from mytable;
集合返回函数可以在选择列表中使用,并将与从基表检索的行进行交叉联接

我认为这是一种未经记录的行为,将来可能会消失,但我不确定我是否记得邮件列表中关于这一点的一些讨论


非常优雅的解决方案!我喜欢!几天前,当我第一次在另一个问题/答案中看到这种行为时,我很惊讶。我认为它值得提出自己的问题。在选择列表中确实有一些,其中一个正在进行交叉连接。所以我想它就在这里。
DROP TABLE ztable ;
CREATE TABLE ztable (zname varchar, zvalue INTEGER NOT NULL);

INSERT INTO ztable(zname, zvalue) VALUES( 'one', 1), ( 'two', 2 ), ( 'three', 3) , ( 'four', 4 );

WITH expand AS (
        WITH RECURSIVE zzz AS (
        SELECT 1::integer AS rnk , t0.zname
        FROM ztable t0
        UNION
        SELECT 1+rr.rnk , t1.zname
        FROM ztable t1
        JOIN zzz rr ON rr.rnk < t1.zvalue
        )
        SELECT zzz.zname
        FROM zzz
        )
SELECT x.*
FROM expand x
        ;