SQL 递归查询,理解 "prior" connect by 子句表达式的问题
SQL Recursive Queries , problems with understanding "prior" expression on connect by clause
我创建了一个如下所示的 table 来理解递归查询:
为此我做了一个插入,导致查询循环,现在我的 table 如下所示(添加了雅典到维也纳的连接):
现在要进行非循环递归查询,我使用了 connect by 函数并编写了以下代码:
select distinct abflug,ankunft,level from flugverbindungen
start with ABFLUG = 'Wien'
connect by nocycle prior ankunft = abflug
order by level;
结果出来了:
我可以看到查询 运行 一直到维也纳,刚刚在 Pressburg 结束。但是当我像这样将先前的表达式从 ankunft 更改为 abflug 时:
select distinct abflug,ankunft,level from flugverbindungen
start with ABFLUG = 'Wien'
connect by nocycle ankunft = prior abflug
order by level;
我得到以下结果:
现在雅典到维也纳有level 2了,很st运行ge,因为根节点应该是维也纳而不是雅典。我也不明白,莱巴赫到贝尔格莱德怎么变成4级了。
总而言之,我实际上不明白先前的表达式在查询中发生了什么变化以及它有什么用。如果您能用这个例子解释先前的表达式,我将不胜感激。当我交换先前表达式的一侧时,实际发生了什么变化?
您可以使用递归 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 中的 运行 示例。
正如我们所知,递归查询正在调用自身,我们总是从之前的行中接管 parents 列。在我们的递归查询中,我们定义了我们想要从前一行中接管哪一列。在我的例子中,我总是使用 arrivals 列 (ankunft) 并将其更改为我的新出发地,因此我必须使用 ankunft 作为之前的列。否则结果在语义上将是不正确的,因为我们想模拟一架飞机从我们定义的车站(在我的例子中是 Wien)开始飞过车站。
感谢 Impaler 试图帮助我。
我创建了一个如下所示的 table 来理解递归查询:
为此我做了一个插入,导致查询循环,现在我的 table 如下所示(添加了雅典到维也纳的连接):
现在要进行非循环递归查询,我使用了 connect by 函数并编写了以下代码:
select distinct abflug,ankunft,level from flugverbindungen
start with ABFLUG = 'Wien'
connect by nocycle prior ankunft = abflug
order by level;
结果出来了:
我可以看到查询 运行 一直到维也纳,刚刚在 Pressburg 结束。但是当我像这样将先前的表达式从 ankunft 更改为 abflug 时:
select distinct abflug,ankunft,level from flugverbindungen
start with ABFLUG = 'Wien'
connect by nocycle ankunft = prior abflug
order by level;
我得到以下结果:
现在雅典到维也纳有level 2了,很st运行ge,因为根节点应该是维也纳而不是雅典。我也不明白,莱巴赫到贝尔格莱德怎么变成4级了。
总而言之,我实际上不明白先前的表达式在查询中发生了什么变化以及它有什么用。如果您能用这个例子解释先前的表达式,我将不胜感激。当我交换先前表达式的一侧时,实际发生了什么变化?
您可以使用递归 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 中的 运行 示例。
正如我们所知,递归查询正在调用自身,我们总是从之前的行中接管 parents 列。在我们的递归查询中,我们定义了我们想要从前一行中接管哪一列。在我的例子中,我总是使用 arrivals 列 (ankunft) 并将其更改为我的新出发地,因此我必须使用 ankunft 作为之前的列。否则结果在语义上将是不正确的,因为我们想模拟一架飞机从我们定义的车站(在我的例子中是 Wien)开始飞过车站。
感谢 Impaler 试图帮助我。