Sql 尝试从树结构检索数据时出现重复条目
我有两张桌子:Sql 尝试从树结构检索数据时出现重复条目,sql,oracle,Sql,Oracle,我有两张桌子: obs\u结构(id,auteur\u cre,dt\u cre,dt\u modif,description,auteur\u modif,structid,tag) 及 obs\u结构元素(id、auteur\u cre、dt\u cre、dt\u modif、描述、auteur\u modif、可选、重复、套件、标签、终端、父项id、类型id) 此表之间有一个链接,如:obs\u structure\u element.parent\u id=obs\u structure
obs\u结构(id,auteur\u cre,dt\u cre,dt\u modif,description,auteur\u modif,structid,tag)
及
obs\u结构元素(id、auteur\u cre、dt\u cre、dt\u modif、描述、auteur\u modif、可选、重复、套件、标签、终端、父项id、类型id)
此表之间有一个链接,如:obs\u structure\u element.parent\u id=obs\u structure.id
和obs\u structure\u element.type\u id=obs\u structure.id
我想给出一个特殊的obs_结构.structid
,并检索这个结构的所有子结构。我找到了一段代码,并根据我的用例进行了调整:
select * from
(
select
os.id as structure_id,
os.description as structure_descr,
os.structid as structid,
os.tag as structure_tag,
ose.id as element_id,
ose.description as element_descr,
ose.optional as element_optional,
ose.repetitive as element_repetitif,
ose.suite as elements_suite,
ose.tag as element_tag,
ose.terminal as element_terminal,
ose.parent_id as element_parent_id,
ose.type_id as element_type_id
from obs_structure os
right join OBS_STRUCTURE_ELEMENT ose
on os.ID = ose.TYPE_ID
)
start with element_parent_id = (select os.id from obs_structure os where os.structid = 'BDP')
connect by PRIOR element_type_id = element_parent_id
order by element_parent_id, elements_suite;
这给了我所选择的结构的所有子结构。问题是,由于我无法理解的原因,我有重复的条目(见图)。
PS:我的数据库是oracle
谢谢你的帮助:)
编辑:
如果我们用select count(*)
替换第一个select,我们有421个条目,但是如果我们用select count(distinct(element_id))
替换,我们有260个条目,这似乎是我应该拥有的正确数量的条目
EDIT2:
看来我的问题可以这样解决:
select distinct structure_id,structure_descr,structid,structure_tag,element_id,element_descr,elements_suite,element_tag,element_parent_id,element_type_id from
(
select
os.id as structure_id,
os.description as structure_descr,
os.structid as structid,
os.tag as structure_tag,
ose.id as element_id,
ose.description as element_descr,
ose.suite as elements_suite,
ose.tag as element_tag,
ose.parent_id as element_parent_id,
ose.type_id as element_type_id
from obs_structure os
right join OBS_STRUCTURE_ELEMENT ose
on os.ID = ose.TYPE_ID
)
start with element_parent_id = (select os.id from obs_structure os where os.structid = 'BDP')
connect by PRIOR element_type_id = element_parent_id
order by element_parent_id, elements_suite;
我想这是因为
右连接。您可以将其更改为内部联接
以删除DUP吗?obs\u结构\u元素。父\u id
和obs\u结构\u元素。键入\u id
=obs\u结构.id
。这是对的吗?@WEI_DBA Withenner JOIN
我释放了所有structure_id/element_type_id=null的条目,我需要它们,因为它们是我树的最后一步。@APC外键约束声明:OBS_structure.id(structure_id)=OBS_structure_element.type_id(element_type_id)
和OBS\u STRUCTURE\u ELEMENT.PARENT\u ID(ELEMENT\u PARENT\u ID)
向我们显示了哪个结构\u ID/ELEMENT\u TYPE\u ID是当前条目的父项。显然,问题出在联接中的某个地方:您得到了笛卡尔积,因为您错过了一个条件。这是你能从提供的信息中得到的最好的信息。如果你想要一个更详细的答案,你需要发布一个简化的数据模型(更少的列)和一些演示行为的示例数据。