Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.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_Sql Server_Database_Tsql - Fatal编程技术网

SQL查询以获取层次结构中位于较高位置的所有记录的列表

SQL查询以获取层次结构中位于较高位置的所有记录的列表,sql,sql-server,database,tsql,Sql,Sql Server,Database,Tsql,表格: +-----+------------+-------------+ | Id | DocumentNo | ParentCCID | +-----+------------+-------------+ | 10 | CC001 | NULL | | 20 | CC002 | CC001 | | 33 | CC003 | CC002 | +-----+-------------+-------------+

表格:

+-----+------------+-------------+
| Id  | DocumentNo | ParentCCID  |
+-----+------------+-------------+
|  10 | CC001      | NULL        |
|  20 | CC002      | CC001       |
|  33 | CC003      | CC002       |
+-----+-------------+-------------+
CC003
CC002
CC001
select b2.documentno,b2.ParentCCID  from basicdetails  b1 
inner join basicdetails b2 on b1.documentno = b2.ParentCCID 
where b2.documentno='CC003' 
create table basicdetails2
  (
    id int identity,
    documentno varchar(30),
    parentccid varchar(30)
  )
    insert into basicdetails2 values('CC001', null)
    insert into basicdetails2 values('CC002', 'CC001')
    insert into basicdetails2 values('CC003', 'CC002')
    insert into basicdetails2 values('CC004', 'CC003')
传递给查询的值:
CC003

预期输出:

+-----+------------+-------------+
| Id  | DocumentNo | ParentCCID  |
+-----+------------+-------------+
|  10 | CC001      | NULL        |
|  20 | CC002      | CC001       |
|  33 | CC003      | CC002       |
+-----+-------------+-------------+
CC003
CC002
CC001
select b2.documentno,b2.ParentCCID  from basicdetails  b1 
inner join basicdetails b2 on b1.documentno = b2.ParentCCID 
where b2.documentno='CC003' 
create table basicdetails2
  (
    id int identity,
    documentno varchar(30),
    parentccid varchar(30)
  )
    insert into basicdetails2 values('CC001', null)
    insert into basicdetails2 values('CC002', 'CC001')
    insert into basicdetails2 values('CC003', 'CC002')
    insert into basicdetails2 values('CC004', 'CC003')
尝试失败:

+-----+------------+-------------+
| Id  | DocumentNo | ParentCCID  |
+-----+------------+-------------+
|  10 | CC001      | NULL        |
|  20 | CC002      | CC001       |
|  33 | CC003      | CC002       |
+-----+-------------+-------------+
CC003
CC002
CC001
select b2.documentno,b2.ParentCCID  from basicdetails  b1 
inner join basicdetails b2 on b1.documentno = b2.ParentCCID 
where b2.documentno='CC003' 
create table basicdetails2
  (
    id int identity,
    documentno varchar(30),
    parentccid varchar(30)
  )
    insert into basicdetails2 values('CC001', null)
    insert into basicdetails2 values('CC002', 'CC001')
    insert into basicdetails2 values('CC003', 'CC002')
    insert into basicdetails2 values('CC004', 'CC003')
注意:DocumentNo是唯一的主键。如果没有父记录,ParentCCID可能有空值

编辑:

+-----+------------+-------------+
| Id  | DocumentNo | ParentCCID  |
+-----+------------+-------------+
|  10 | CC001      | NULL        |
|  20 | CC002      | CC001       |
|  33 | CC003      | CC002       |
+-----+-------------+-------------+
CC003
CC002
CC001
select b2.documentno,b2.ParentCCID  from basicdetails  b1 
inner join basicdetails b2 on b1.documentno = b2.ParentCCID 
where b2.documentno='CC003' 
create table basicdetails2
  (
    id int identity,
    documentno varchar(30),
    parentccid varchar(30)
  )
    insert into basicdetails2 values('CC001', null)
    insert into basicdetails2 values('CC002', 'CC001')
    insert into basicdetails2 values('CC003', 'CC002')
    insert into basicdetails2 values('CC004', 'CC003')

您需要递归cte:

with cte as (
      select bd.documentno, bd.ParentCCID
      from basicdetails bd
      where bd.documentno = 'CC003'
      union all
      select cte.documentno, cte.ParentCCID
      from cte join
           basicdetails bd
           on bd.documentno = cte.ParentCCID
     )
select bd.documentno
from cte;

对戈登的答案(已经是+1)只是一个小小的改变

我喜欢跟踪水平,并看到每个记录的家长

示例

Declare @Fetch varchar(25) = 'CC003'

;with cte as (
      Select DocumentNo
            ,ParentCCDocumentNo
            ,Lvl=1
      From   YourTable 
      Where  DocumentNo=@Fetch
      Union  All
      Select R.DocumentNo
            ,R.ParentCCDocumentNo
            ,P.Lvl+1
      From   YourTable R
      Join   cte P on P.ParentCCDocumentNo = R.DocumentNo)
Select Lvl = Row_Number() over (Order By Lvl Desc)
      ,DocumentNo
      ,ParentCCDocumentNo
From cte
Order By 1 desc
返回

Lvl DocumentNo  ParentCCDocumentNo
3   CC003       CC002
2   CC002       CC001
1   CC001       NULL

为什么尝试失败了?所以成功了,但我想知道是否有一个非递归的解决方案?@SamuraiJack技术上是的,但他们可能会变得有点难看,特别是如果你有一个可变的深度层次结构。。您是否一次要查找多条路径?深度可能会有所不同,但一条路径只有一个直接父级record@SamuraiJack由于您的层次结构是可变的或参差不齐的,因此递归CTE是迄今为止最好的选择。这是另一个供您考虑的选项@SamuraiJack Methink认为,
join
应该是bd.documentno=cte.ParentCCID上的
。第二个
select
应该是
bd.documentno,bd.ParentCCID
,而不是
cte.