SQLite DELETE с помощью оператора WITH - PullRequest
0 голосов
/ 23 сентября 2018

У меня ровно один цикл длины 3 в моем графике дорог.Я пытаюсь удалить дорогу, которая идет от AB и BA, которая является частью цикла.Если я удалю одну дорогу, это удалит цикл и превратит мой график в дерево.Я могу найти дорогу, которая делает это, используя оператор с .Тем не менее, я хочу затем удалить из исходной таблицы на основе того, что я нашел, но мне кажется, что я не могу использовать оператор удаления в моем коде.Я слышал о «соединениях», но я не уверен, как я мог бы использовать это здесь, и был бы признателен за некоторые советы.

Следующий код находит несколько дорог, которые способствуют циклу длины 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 голосов
/ 23 сентября 2018

Вы можете использовать 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 синтаксис.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...