对单个表进行递归选择或联接



我有一个表,它有一列用于namegrp_ip(组id(pgrp_id(父组id(

我的出发点是选择任何父组id为1083:的条目

select grp_id, pgrp_id, name from CM_GROUP where pgrp_id = 1083

这给我看了下面的

新南威尔士州
grp_idpgrp_id名称
10841083ACT
10861083VIC
10871083昆士兰州
10881083SA
10891083华盛顿州
10901083TAS
10911083NT

这似乎是三个级别:状态、站点和系统。我想知道为什么这是一个层次表,而不是三个单独的表。您的数据库允许一个国家成为一个国家的一部分,允许一个站点成为一个系统的一部分。

我会更改数据模型。但是,我们可以在查询中将一个表视为单独的表。

with states as
(
select grp_id as state_id, name as state_name
from mytable
where pgrp_id = 1083
)
, sites as
(
(
select grp_id as site_id, pgrp_id as state_id, name as site_name
from mytable
where pgrp_id in (select state_id from states)
)
, systems as
(
(
select grp_id as system_id, pgrp_id as site_id, name as system_name
from mytable
where pgrp_id in (select site_id from sites)
)
select
sy.system_id, sy.system_name, si.site_id, si.site_name, st.state_id, st.state_name
from states st
join sites si on si.state_id = st.state_id
join systems sy on sy.site_id = si.site_id
order by st.state_id, si.site_id, sy.system_id;

同样的东西要短得多,更容易出错,可读性可能稍差,因为ID最终会得到它们的名字:

select
sy.prg_id as system_id, sy.name as system_name,
si.prg_id as site_id, si.name as site_name,
st.prg_id as state_id, st.name as state_name
from mytable st
join mytable si on si.pgrp_id = st.prg_id
join mytable sy on sy.pgrp_id = si.prg_id
where st.pgrp_id = 1083
order by st.prg_id, si.prg_id, sy.prg_id;

最新更新