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