如何为自引用表和联结表(duh)编写递归查询

时间:2015-08-20 14:24:08

标签: sql sqlite

1。图

我有一个引用自身的表实体。由于它是1-M关系,我创建了一个junktion表relation entity

enter image description here

2。表实体

TABLE ENTITY (ID INTEGER PRIMARY KEY, ID_ENTITY, wiki_title TEXT);

2.1样本

Id   |ID_ENTITY|  wiki_title   
19127|m.06w4why|Sterling_Hill_Historic_District
19128|m.017ym9|Saint_John_County,_New_Brunswick
19129|m.0jl0r_0|Sheshnag_Lake

3。 Relation_entity

CREATE TABLE RELATION_ENTITE (ID INTEGER PRIMARY KEY, ID_SOURCE TEXT, ID_DESTINATION TEXT NOT NULL, FOREIGN KEY(ID_SOURCE) REFERENCES ENTITE(ID_ENTITE), FOREIGN KEY(ID_DESTINATION) REFERENCES ENTITE(ID_ENTITE));

3.1样本

正如您在以下示例中看到的,m.06w4why与其他三个实体有关系,即:m.01x73m.0rg75m.0rg9n

ID   |id source| id_destination
119647|m.06w4why|m.01x73|
119648|m.06w4why|m.0rg75|
119649|m.06w4why|m.0rg9n|
119650|m.06w4why|m.05gk2h0|

119651|m.017ym9|m.074r0|
119652|m.017ym9|m.059s8|

119653|m.0jl0r_0|m.02p8px5|
119654|m.0jl0r_0|m.0f5wwn|

4。问题

id_destination中的值将变为id_source。我的问题是我能在多大程度上深入数据库以检索所有关系。

例如对于m.06w4why我想要检索从m.01x73m.0rg75m.0rg9n开始的所有关系并将它们组合在一起。

注意

我认为这是一个非常难的问题。如果不清楚,请告诉我。而且它超出了我的范围lol

谢谢。

1 个答案:

答案 0 :(得分:1)

假设您有一个包含sources列的表id。 获取这些特定源的目标的查询如下:

SELECT id_destination
FROM relation_entite
JOIN sources ON relation_entite.id_source = sources.id;

然后将其插入CTE,以获得用于搜索子树的基本recursive CTE

WITH RECURSIVE ids(id) AS (
  VALUES('m.06w4why')                -- start with this record
  UNION ALL
  SELECT id_destination              -- get destinations for any previous sources
  FROM relation_entite
  JOIN ids ON relation_entite.id_source = ids.id
)
SELECT id FROM ids;

(如果数据中可能存在循环,则必须使用UNION而不是UNION ALL。)