SQL Server将父子项归一化为单列?

时间:2014-05-15 02:55:32

标签: sql-server parent-child partitioning

我正在使用MSSQL 2012,我正在尝试弄清楚如何在一列中使用父值和在另一列中使用子值,并将其合并到一列中,而父级仅在一行中显示相应的孩子在它下面显示。使用row_number()/ partition进行练习并不富有成效。

我怎样才能实现这一目标?

感谢。

set nocount on
declare @parchi table ( parenttext varchar(20) , childtext varchar(20) )
insert into @parchi values ( 'parenta' , 'childa' )
insert into @parchi values ( 'parenta' , 'childc' )
insert into @parchi values ( 'parenta' , 'childb' )
insert into @parchi values ( 'parentb' , 'child1' )
insert into @parchi values ( 'parentb' , 'child3' )
insert into @parchi values ( 'parentb' , 'child2' )


select childtext,ROW_NUMBER() over (partition by parenttext order by parenttext,childtext) as tempordnum from @parchi 


-- below is shape of the result set. what i came up with does not include the parent at the top of each grouping set (pun intentional(.
parenta
childa
childb
childc
parentb
child1
child2
child3

2 个答案:

答案 0 :(得分:1)

尝试这个建议:

您将需要分别选择父项和子项,然后您将UNION两者选择。

  1. 选择父级,并使用row_number创建父级ID(parenta id = 1,parent b id = 2)

  2. 选择子项,并根据parenttext字段使用dense_rank。这将给孩子一个id(childa - childc将id = 1,child1-3将id = 2)

  3. 结合结果,你会得到你想要的东西

答案 1 :(得分:1)

你可以这样做。它首先得到父母,并为每一个人分配一个等级。然后它得到孩子并再次指定父级别加上孩子级别。最后,它从按父订单排序的联合获得结果,然后是子订单。

您可以在ORDER BY的{​​{1}}部分添加其他列,以进一步对儿童进行排序。

DENSE_RANK()