2017-06-04 58 views
1

我有一個表,看起來像如何返回,並開始在一個層次結構的路徑的終點

--------------------------- 
| id1 | id2 | col1 | col2 | 
+-----+-----+------+------+ 
| 1 | 1 | a | b | 
|-----+-----+------+------| 
| 1 | 2 | b | c | 
|-----+-----+------+------| 
| 5 | 1 | d | f | 
--------------------------- 

的想法是,該表存儲路徑:A-> B-> c和d - > F。我想要的是一個將返回a-> c和d-> f的查詢。

回答

0

我想你可能意味着

select a, b, c from whateveryourtablenameis; 

,包括你除了A,B和C想要的任何列。

這將只返回列a,b和c。我知道沒有辦法要求SQL除了*之外的一系列列。

1

你需要一個遞歸查詢:

with recursive find_path (col1, col2, depth) as (
    select col1, col2, 1 
    from my_table t 
    where not exists (
     select 1 
     from my_table 
     where col2 = t.col1) 
union all 
    select p.col1, t.col2, depth+ 1 
    from my_table t 
    join find_path p on p.col2 = t.col1 
) 

select distinct on (col1) format('%s -> %s', col1, col2) as path 
from find_path 
order by col1, depth desc; 

    path 
-------- 
a -> c 
d -> f 
(2 rows) 

的問題不是很清楚。如果您的目標是通過id2按id1順序獲取分區中的路徑,則可以使用窗口函數:

select distinct on (id1) 
    id1, first_value(col1) over w, last_value(col2) over w 
from my_table 
window 
    w as (partition by id1 order by id2) 
order by id1, id2 desc; 

id1 | first_value | last_value 
-----+-------------+------------ 
    1 | a   | c 
    5 | d   | f 
(2 rows)  
相關問題