SQL Рекурсивные запросы, проблемы с пониманием «предшествующего» выражения в предложении connect by - PullRequest
0 голосов
/ 06 мая 2020

Я создал следующую таблицу, чтобы понимать рекурсивные запросы:

enter image description here

enter image description here

Для этого я сделал вставку, чтобы вызвать al oop в запрос, и теперь моя таблица выглядит следующим образом (добавлено соединение Афины-Вена):

enter image description here

Теперь, чтобы сделать нециклический рекурсивный запрос, я использовал функцию connect by и написал следующий код:

select distinct abflug,ankunft,level from flugverbindungen
start with ABFLUG = 'Wien'
connect by nocycle prior ankunft =  abflug
order by level;

Получился результат:

enter image description here

Я вижу, что запрос выполнялся до Вены и только что закончился в Прессбурге. Но когда я меняю предыдущее выражение с ankunft на abflug следующим образом:

select distinct abflug,ankunft,level from flugverbindungen
    start with ABFLUG = 'Wien'
    connect by nocycle  ankunft = prior abflug
    order by level;

, я получаю следующий результат:

enter image description here

Теперь Афины - Вена имеют уровень 2, что очень странно, потому что узел root должен быть Веной, а не Афинами. Я также не понимаю, как Laibach to Belgrade стал четвертым уровнем.

В заключение я действительно не понимаю, что предшествующее выражение меняет в запросе и для чего оно годится. Я был бы очень признателен, если бы вы объяснили предыдущее выражение этим примером. Что на самом деле меняется, когда я меняю местами предыдущее выражение?

Ответы [ 2 ]

1 голос
/ 06 мая 2020

Вы можете использовать рекурсивный CTE для обхода графика. Например:

with
c (abflug, ankunft, lvl) as (
  select abflug, ankunft, 1 from t where abflug = 'Wien'
  union all
  select t.abflug, t.ankunft, c.lvl + 1
  from c
  join t on t.abflug = c.ankunft and c.lvl <= 4
)
select * from c;

Результат:

ABFLUG   ANKUNFT    LVL
-------  ---------  ---
Wien     Pressburg    1
Wien     Laibach      1
Laibach  Paris        2
Laibach  Belgrad      2
Belgrad  Athen        3
Athen    Wien         4
Wien     Pressburg    5
Wien     Laibach      5

См. Рабочий пример на db <> fiddle .

0 голосов
/ 06 мая 2020

Как мы знаем, рекурсивные запросы вызывают сами себя, и мы всегда занимаем родительский столбец из предыдущей строки. С помощью Prior мы определяем, какой столбец мы хотим заменить предыдущей строкой в ​​нашем рекурсивном запросе. В моем случае я всегда беру столбец прибытия (ankunft) и меняю его на мой новый отъезд, поэтому я должен использовать ankunft в качестве предыдущего столбца. В противном случае результаты не будут правильными семантически, потому что мы хотим смоделировать самолет, который летит через станции, начиная со станции, которую мы определяем (в моем случае Вена).

Спасибо The Impaler за попытку помочь мне хотя.

...