簡體   English   中英

PostgreSQL連接使用generate_series對表進行非規范化

[英]PostgreSQL join to denormalize a table with generate_series

我有這張桌子:

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行約翰,2行標記,3行阿爾伯特。 但是如果我不知道最高計數(在這種情況下為4),我就不能使用generate_series()函數。 有一種方法可以在不知道MAX(計數)的情況下做到這一點?

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

設置返回函數可以在select列表中使用,並將與從基表中檢索的行進行交叉連接。

認為這是一種未記載的行為,可能會在將來消失,但我不確定(我記得在郵件列表上有關於此的一些討論)

SQLFiddle示例

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
        ;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM