SQL命令由两列组成,如源,目标序列

时间:2016-03-16 12:07:29

标签: sql postgresql hierarchical-data sql-order-by

我的桌子是这样的:

ID  SOURCE  TARGET
1      9      8
2      0      7
3      5      4
4      4      9
5      7      5

那么,我该如何命令这样做:

ID  SOURCE  TARGET
2      0      7
5      7      5
3      5      4
4      4      9
1      9      8

从目标的'0'排序开始,以及下一个源列......

drop table if exists test;
create table  test(id integer, source integer, target integer);

DROP INDEX IF EXISTS idx_ts;

CREATE INDEX idx_ts
  ON test
  USING btree
  (source);

DROP INDEX IF EXISTS public.idx_tt;

CREATE INDEX idx_tt
  ON test
  USING btree
  (target);


insert into  test values(1, 9, 8);
insert into  test values(2, 0, 7);
insert into  test values(3, 5, 4);
insert into  test values(4, 4, 9);
insert into  test values(5, 7, 5);

这是我的样本表。

1 个答案:

答案 0 :(得分:2)

这可以使用构建树的递归查询来完成。为了使层次结构的顺序正确,您需要计算知道"级别"每一行。

with recursive targets as (
  select id, source, target, 1 as level
  from omar
  where source = 0
  union all
  select c.id, c.source, c.target, p.level + 1
  from omar c 
    join targets p on c.source = p.target
)
select id, source, target
from targets
order by level;

由于您的层次结构是"平坦",只需计算基本上距离起点的距离的水平即可。

有关递归查询的更多详细信息check out the tutorial in the Postgres manual