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 With
enner 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是当前条目的父项。显然,问题出在联接中的某个地方:您得到了笛卡尔积,因为您错过了一个条件。这是你能从提供的信息中得到的最好的信息。如果你想要一个更详细的答案,你需要发布一个简化的数据模型(更少的列)和一些演示行为的示例数据。