基于非唯一订单号的父子层次结构

时间:2018-11-24 21:43:13

标签: sql sql-server sql-server-2008 hierarchy hierarchical-data

我有一个包含系统和订单号列的表,该表不是唯一的。我想根据订单号连接系统

+----------------------+  
¦ system       ¦OrderNo¦
¦--------------+-------+ 
¦ system1      ¦ 1     ¦  
¦ system2      ¦ 2     ¦  
¦ system3      ¦ 3     ¦ 
¦ system4      ¦ 4     ¦ 
¦ system1      ¦ 1     ¦ 
¦ system2      ¦ 2     ¦  
¦ system5      ¦ 1     ¦  
¦ system6      ¦ 2     ¦ 
¦ system7      ¦ 1     ¦ 
¦ system8      ¦ 2     ¦ 
+----------------------+

如何基于OrderNo列生成父子关系。其中1-2-3-4是一组,而1-2,1-2,1-2是另一组

所需的输出如下

+----------------------+  
¦ Parent       ¦Child  ¦
¦--------------+-------+ 
¦ system1      ¦system2¦  
¦ system2      ¦system3¦  
¦ system3      ¦system4¦ 
¦ system4      ¦NULL   ¦ 
¦ system1      ¦system2¦ 
¦ system2      ¦NULL   ¦  
¦ system5      ¦system6¦  
¦ system6      ¦NULL   ¦ 
¦ system7      ¦system8¦ 
¦ system8      ¦NULL   ¦ 
+----------------------+

1 个答案:

答案 0 :(得分:0)

正如我在评论中提到的那样,如果只有这些专栏,那么您追求的目标是无法实现的。如果没有某种升序的唯一键,则无法确定关系。如果我们 要做 添加唯一的升序键,那么我们可以实现这一点。

如果您使用的是SQL Server 2012+(2008年不再受支持,并且即将终止扩展支持,那么现在升级应该是非常优先的),那么您可以使用{{1} },然后使用ROWS BETWEEN

LEAD

如果无法访问CREATE TABLE dbo.SampleTable (ID int IDENTITY(1,1), [system] varchar(8), OrderNo int); INSERT INTO dbo.SampleTable([System],OrderNo) VALUES('system1',1), ('system2',2), ('system3',3), ('system4',4), ('system1',1), ('system2',2), ('system5',1), ('system6',2), ('system7',1), ('system8',2); GO WITH Groups AS( SELECT ID, [System], COUNT(CASE WHEN OrderNo = 1 THEN 1 END) OVER (ORDER BY ID ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS Grp FROM dbo.SampleTable) SELECT [System] AS Parent, LEAD([System]) OVER (PARTITION BY Grp ORDER BY ID) AS Child FROM Groups; GO LEAD,则必须更具创造力;而且解决方案的速度会慢得多:

ROWS BETWEEN