快速从表中获取所有相关行

时间:2019-04-16 15:23:32

标签: sql postgresql

我有一个大表,其中有多个列表示链接的事件。其中包括列idnextId,其中id表示某个事件1的ID,而nextId则建议使用该event1的另一个事件。但是,没有列'prev_id'会说哪个event0促成了event1。是否有可能构建一个查询,该查询将为我生成这样的表而无需花费很长时间?

这是我的意思的示例:

id | nextId
10 |  34
5  | 67
22 | 23
2  | 10
16 | 22
4  | 5

我想要的是以下内容:

prev_id | id | next_id
2       | 10 | 34
4       | 5  | 67
16      | 22 | 23

3 个答案:

答案 0 :(得分:0)

您可以使用join

select t.id as prev_id, t.nextid as id, tnext.nextid as next_id
from t join
     t tnext
     on tnext.id = t.nextid;

答案 1 :(得分:0)

您只需要自我加入即可。

但是出于可读性考虑,我建议使用CTE:

with prevs as (
    select nextid as id, id as previd from ids
)
select previd, id, nextid
from ids
join prevs using(id)
;
 previd | id | nextid 
--------+----+--------
      4 |  5 |     67
      2 | 10 |     34
     16 | 22 |     23
(3 rows)

答案 2 :(得分:0)

除了其他人所说的,您还可以使用分层查询来完成此操作。

WITH test_data AS (
    SELECT 10 AS ID,34 AS nextID FROM DUAL
    UNION SELECT 5,67 FROM DUAL
    UNION SELECT 22,23 FROM DUAL
    UNION SELECT 2,10 FROM DUAL
    UNION SELECT 16,22 FROM DUAL
    UNION SELECT 4,5 FROM DUAL
)
SELECT h.*
FROM (
    SELECT PRIOR t.ID AS prevID,
           t.ID,
           t.nextID
    FROM test_data t
    CONNECT BY t.ID = PRIOR t.nextID
) h
WHERE h.prevID IS NOT NULL
ORDER BY h.prevID