3

我有这张桌子:

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)

所以每个名字的行数等于计数列:我有 4 行 john,2 行 mark,3 行 albert。但是如果我不知道最高计数(在本例中为 4),我将无法使用 generate_series() 函数。有没有办法在不知道 MAX(count) 的情况下做到这一点?

4

2 回答 2

4
select name, 
       generate_series(1,count)
from mytable;

集合返回函数可以在select列表中使用,并将与从基表中检索到的行进行交叉连接。

认为这是一种未记录的行为,将来可能会消失,但我不确定(我记得在邮件列表中对此进行了一些讨论)

SQLFiddle 示例

于 2012-09-25T09:18:16.653 回答
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
        ;
于 2012-09-25T11:01:01.123 回答