我有一个引用自身的表实体。由于它是1-M关系,我创建了一个junktion表relation entity
。
TABLE ENTITY (ID INTEGER PRIMARY KEY, ID_ENTITY, wiki_title TEXT);
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
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));
正如您在以下示例中看到的,m.06w4why
与其他三个实体有关系,即:m.01x73
,m.0rg75
和m.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|
id_destination
中的值将变为id_source
。我的问题是我能在多大程度上深入数据库以检索所有关系。
例如对于m.06w4why
我想要检索从m.01x73
,m.0rg75
和m.0rg9n
开始的所有关系并将它们组合在一起。
我认为这是一个非常难的问题。如果不清楚,请告诉我。而且它超出了我的范围lol
谢谢。答案 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。)