我有这张桌子:
CREATE TABLE "mytable"
( name text, count integer );
INSERT INTO mytable VALUES ('john', 4),('mark',2),('albert',3);
我希望用这种方式“denormlize”行:
SELECT name FROM mytable JOIN generate_series(1,4) tmp(a) ON (a<=count)
所以我的每个名字都有一些行等于count列:我有4行john,2行有标记,3行有albert。 但是如果我不知道最高计数(在这种情况下为4),我就不能使用generate_series()函数。有一种方法可以在不知道MAX(计数)的情况下做到这一点吗?
答案 0 :(得分:4)
select name,
generate_series(1,count)
from mytable;
设置返回函数可以在select
列表中使用,并将与从基表中检索的行进行交叉连接。
我认为这是一种未记载的行为,将来可能会消失,但我不确定(我记得在邮件列表上有关于此的一些讨论)
答案 1 :(得分:0)
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
;