dj1*_*121 1 sql sqlite tree graph cycle
我的道路图中正好有一个长度为 3 的循环。我正在尝试删除一条从 AB 和 BA 出发的道路,该道路是循环的一部分。如果我删除一条路,它将删除循环并使我的图表成为一棵树。我可以通过使用with语句找到一条可以做到这一点的道路。但是,我想根据我发现的内容从原始表中删除,但我似乎无法在代码中使用删除语句。我听说过“连接”,但我不确定如何在这里使用它,并且希望得到一些建议。
下面的代码找到了多条道路,这些道路对长度为 3 的循环有贡献,但我将其限制为 1,因为我只想删除一条道路。
%%sql
with cycle as(
select s1.A as s1, s3.A as s3
from streets s1, streets s2, streets s3
where s1.B = s2.A and s2.B = s3.A and s3.B = s1.A
limit 1)
select A, B
from streets, cycle
where (s1 = A and s3 = B) or (s3 = A and s1 = B)
Run Code Online (Sandbox Code Playgroud)
返回:
我想删除原始表中与这些 A 和 B 值匹配的两行,从而删除 GadgetCo 和 Thing Industries 之间的道路
您可以exists在子句中使用 for 匹配条件where:
with cycle as (
select s1.A as s1, s3.A as s3
from streets s1 join
streets s2
on s1.B = s2.A join
streets s3
on s2.B = s3.A and s3.B = s1.A
limit 1
)
delete from streets
where exists (select 1
from cycle c
where (streets.A = c.s1 and streets.B = c.s3) or
(streets.A = c.s3 and streets.B = c.s1)
);
Run Code Online (Sandbox Code Playgroud)
请注意,我用正确、显式、标准的 JOIN语法替换了您的隐式连接。