Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何获取某一类型的顶级元素?_Sql_Oracle_Connect By - Fatal编程技术网

Sql 如何获取某一类型的顶级元素?

Sql 如何获取某一类型的顶级元素?,sql,oracle,connect-by,Sql,Oracle,Connect By,假设我有类似的东西(驱动器C:上的文件夹层次结构) 我想获取给定文件夹的顶部文件夹(在本例中,我选择了'1'),而不是光盘本身,我该怎么做 层次结构可以有不同的层次 with data as ( select '1' name, 'folder' type, 'docs' parent from dual union select '2' name, 'folder' type, 'docs' parent from dual union select '3' name, 'folder' t

假设我有类似的东西(驱动器C:上的文件夹层次结构)

我想获取给定文件夹的顶部文件夹(在本例中,我选择了
'1'
),而不是光盘本身,我该怎么做

层次结构可以有不同的层次

with data as 
(
select '1' name, 'folder' type, 'docs' parent from dual union
select '2' name, 'folder' type, 'docs' parent from dual union
select '3' name, 'folder' type, 'docs' parent from dual union
select 'docs' name, 'folder' type, 'MyFolder' parent from dual union
select 'MyFolder' name, 'folder' type, 'C:\' parent from dual union
select 'C:\' name, 'Drive' type, null parent from dual 
)
select name, level from data
start with name = '1'
connect by prior parent = name
order by level;
预期输出:
'Myfolder'
,因为它没有任何其他文件夹作为父文件夹。

这里有一个选项:

SQL> with data as
  2  (
  3  select '1' name       , 'folder' type, 'docs'     parent from dual union
  4  select '2' name       , 'folder' type, 'docs'     parent from dual union
  5  select '3' name       , 'folder' type, 'docs'     parent from dual union
  6  select 'docs' name    , 'folder' type, 'MyFolder' parent from dual union
  7  select 'MyFolder' name, 'folder' type, 'C:\'      parent from dual union
  8  select 'C:\' name     , 'Drive'  type, null       parent from dual
  9  ),
 10  inter as
 11    (select name, level lvl, type
 12     from data
 13     start with name = '1'
 14     connect by prior parent = name
 15    )
 16  select name
 17  from inter
 18  where lvl = (select max(lvl) from inter
 19               where type = 'folder');

NAME
--------
MyFolder

SQL>

请尝试下面的

    WITH data
     AS (SELECT '1' name, 'folder' TYPE, 'docs' parent FROM DUAL
         UNION
         SELECT '2' name, 'folder' TYPE, 'docs' parent FROM DUAL
         UNION
         SELECT '3' name, 'folder' TYPE, 'docs' parent FROM DUAL
         UNION
         SELECT 'docs' name, 'folder' TYPE, 'MyFolder' parent FROM DUAL
         UNION
         SELECT 'MyFolder' name, 'folder' TYPE, 'C:\' parent FROM DUAL
         UNION
         SELECT 'C:\' name, 'Drive' TYPE, NULL parent FROM DUAL)
    SELECT name
      FROM data
     WHERE parent = (SELECT name
                       FROM data
                      WHERE TYPE = 'Drive')
START WITH name = '1'
CONNECT BY PRIOR parent = name
输出

   NAME    
--------
MyFolder

使用真实数据进行测试,并让我们知道结果。

预期输出是什么?通过编辑你的问题来添加。添加了它,谢谢你,user75ponic,我可能对我的目标还不够清楚。它很有用,但只提到了我想要避免的家长类型。但是谢谢,这太好了@Bobby是最顶层文件夹的父文件夹,它将始终支持一个驱动器或光盘,如果我错了,请纠正我。因此,我包含了通过添加子查询而不是硬编码名称来获取名称的条件。