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
;