postgresql是否支持使用WITH子句的遞歸查詢?如果是這樣,這樣的事情可能會起作用。 (如果你想有一個測試的答案,提供一些CREATE TABLE和INSERT語句在你的問題,你需要在插入樣本數據的結果一起。)
with Links(id,link,data) as (
select
id, redirectid, data
from T
where redirectid is null
union all
select
id, redirectid, null
from T
where redirectid is not null
union all
select
Links.id,
T.redirectid,
case when T.redirectid is null then T.data else null end
from T
join Links
on Links.link = T.id
)
select id, data
from Links
where data is not null;
補充說明:
:(你可以基於WITH表達式自己實現遞歸,我不知道用於順序編程的postgresql語法,所以這是有點僞的:
將這個查詢的結果插入一個名爲Links的新表中:
select
id, redirectid as link, data, 0 as depth
from T
where redirectid is null
union all
select
id, redirectid, null, 0
from T
where redirectid is not null
同時聲明一個integer :: depth並將其初始化爲零。然後重複以下操作,直到它不再向鏈接添加行。鏈接將包含您的結果。
increment ::depth;
insert into Links
select
Links.id,
T.redirectid,
case when T.redirectid is null then T.data else null end,
depth + 1
from T join Links
on Links.link = T.id
where depth = ::depth-1;
end;
我認爲這會比任何光標解決方案都更好。事實上,我不能真正想到遊標如何對這個問題有用。
請注意,如果有任何週期(重定向最終是圓形的),它將不會終止。
不幸的是,似乎遞歸支持直到8.4 – 2009-08-07 20:31:00
才被添加。請參閱我在答案中的其他評論。 – 2009-08-09 01:40:49