SQLite使用WITH语句删除

时间:2018-09-23 16:11:57

标签: sql graph sqlite tree cycle

在我的道路图中,我刚好有一个长度为3的自行车。我正在尝试删除循环中从A-B和B-A出发的道路。如果我删除一条道路,它将删除该循环,并将我的图形变成一棵树。通过使用 with 语句,我可以找到一条能做到这一点的道路。但是,我想根据发现的内容从原始表中删除,但似乎无法在代码中使用delete语句。我听说过“ joins”,但是我不确定如何在这里使用它,并希望得到一些建议。

以下代码找到了多条长度为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)

返回:

enter image description here

我想删除原始表中与A和B值匹配的两行,从而删除GadgetCo和Thing Industries之间的路

1 个答案:

答案 0 :(得分:2)

您可以在exists子句中将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)
                 );

请注意,我用正确的,显式的标准 JOIN语法替换了隐式联接。