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 行、マークが 2 行、アルバートが 3 行あります。しかし、最大数 (この場合は 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 に答える