Sql server 从有序表创建层次结构

Sql server 从有序表创建层次结构,sql-server,tsql,Sql Server,Tsql,我有一个在一列中具有父子关系的表 我可以使用加载文件时添加的行号将表按正确顺序排序。 我希望使用排序顺序从列中获得完整的层次结构 样本数据 RowNumber Type Area Name 1 1 Europe Bob 2 2 Scotland Bill 3 3 Edinburgh Dave 4 2 E

我有一个在一列中具有父子关系的表

我可以使用加载文件时添加的行号将表按正确顺序排序。 我希望使用排序顺序从列中获得完整的层次结构

样本数据

RowNumber   Type    Area           Name
1           1       Europe         Bob
2           2       Scotland       Bill
3           3       Edinburgh      Dave
4           2       England        Sharron
5           3       London         Tessa
6           2       Spain          Steve
7           2       Portugal       Carie
8           1       Asia           Helen
9           2       Thailand       John
1           2       Japan          Frank
11          3       Tokyo          Kate
12          3       Osaka          Brian
13          1       North America  Joe
我想说,排除级别1=亚洲的行。 很高兴使用临时表或任何东西来让这个工作


救命啊

我在这里进行猜测,但看起来您正在寻找上一个级别,其值的类型为1。这不是传统分层数据的存储方式,因此我们需要解决这一问题

首先是一些消耗品样本数据:

CREATE TABLE dbo.SampleData (RowNumber int,
                             [Type] int,
                             Area varchar(30),
                             [name] varchar(30));
GO

INSERT INTO dbo.SampleData (RowNumber,
                            [Type],
                            Area,
                            [name])
VALUES(1,1,'Europe','Bob'),
      (2,2,'Scotland','Bill'),
      (3,3,'Edinburgh','Dave'),
      (4,2,'England','Sharron'),
      (5,3,'London','Tessa'),
      (6,2,'Spain','Steve'),
      (7,2,'Portugal','Carie'),
      (8,1,'Asia','Helen'),
      (9,2,'Thailand','John'),
      (10,2,'Japan','Frank'),
      (11,3,'Tokyo','Kate'),
      (12,3,'Osaka','Brian'),
      (13,1,'North America','Joe');
GO
现在,我们需要为父项的ID行号添加一个新列:

ALTER TABLE dbo.SampleData ADD ParentID int;
然后我们需要填充该列:

UPDATE SD
SET ParentID = P.RowNumber
FROM dbo.SampleData SD
     CROSS APPLY (SELECT TOP 1 ca.RowNumber
                  FROM dbo.SampleData ca
                  WHERE ca.[Type] = SD.[Type] - 1 
                    AND ca.RowNumber < SD.RowNumber
                  ORDER BY ca.RowNumber DESC) P;

如果您有已知或最大级别数

范例

返回


您是否可以向我们提供您试图实现的预期结果和查询?出于某种原因,您是否忽略了显示父子关系列?是什么阻止你说排除级别1=亚洲的行?你的问题太不清楚了,现在无法回答。我不知道你想问什么,我可以;在数据中看不到行之间的任何关系。我假设“Japan”应该是第10行,而不是第1行?Larnu,对不起,是的。日本应该是10岁。关系仅为行顺序。因此,level 2是上一个level 1行的子级。第三层是前一层第二排的孩子,等等。我想摆脱任何有亚洲地区的东西。因此,亚洲、日本、东京和朝日都应该被删除。我同意这不是一个合适的等级制度。这就是问题所在。我需要知道每个孩子的完整层次结构。这就是为什么a在上面创建了一个适当的层次结构,@ScottB使用您的数据。
WITH rCTE AS(
    SELECT RowNumber,
           [Type],
           Area,
           [name]
    FROM dbo.SampleData
    WHERE [Type] = 1
      AND Area != 'Asia'
    UNION ALL
    SELECT SD.RowNumber,
           SD.Type,
           SD.Area,
           SD.name
    FROM rCTE r
         JOIN dbo.SampleData SD ON r.RowNumber = SD.ParentID)
SELECT r.RowNumber,
       r.[Type],
       r.Area,
       r.[name]
FROM rCTE r;
Select *
      ,ID  = RowNumber
      ,Pt  = choose( [Type]-1
                   ,max(case when [Type]=1 then RowNumber end) over (Order By RowNumber) 
                   ,max(case when [Type]=2 then RowNumber end) over (Order By RowNumber) 
                   ,max(case when [Type]=3 then RowNumber end) over (Order By RowNumber) 
                   ,max(case when [Type]=4 then RowNumber end) over (Order By RowNumber) 
                   ,max(case when [Type]=5 then RowNumber end) over (Order By RowNumber) 
                   )
 From YourTable A