Sql 如何在嵌套的集合层次结构中排序相似的项?
我有一个查询,它以嵌套的集合结构生成以下输出:Sql 如何在嵌套的集合层次结构中排序相似的项?,sql,tsql,Sql,Tsql,我有一个查询,它以嵌套的集合结构生成以下输出: databaseName | xType | displayLabel | child_xType | child_displayLabel | lft1 | lft2 ---------------------------------------------------------------------------------------------------------
databaseName | xType | displayLabel | child_xType | child_displayLabel | lft1 | lft2
--------------------------------------------------------------------------------------------------------------------------------
Bob label Search Model name NULL NULL 252 NULL
Bob textbox productName button X 254 255
Bob label Company NULL NULL 258 NULL
Bob combobox Company comboboxItem CCCC 260 261
Bob combobox Company comboboxItem DDDD 260 263
Bob combobox Company comboboxItem HHHH 260 265
Larry label Search Model Name NULL NULL 408 NULL
Larry textbox productName button X 410 411
Larry label Company NULL NULL 414 NULL
Larry combobox Company comboboxItem DDDD 416 417
Larry combobox Company comboboxItem HHHH 416 419
“数据库”Bob和Larry之间的唯一区别是Bob有一个额外的comboboxItem,名为“CCCC”。我想要返回的是一个结果集,它结合了“数据库”Bob和Larry的不同元素,同时保持正确的顺序,如下所示
databaseName | xType | displayLabel | child_xType | child_displayLabel
----------------------------------------------------------------------------------------------------
Junior label Search Model name NULL NULL
Junior textbox productName button X
Junior label Company NULL NULL
Junior combobox Company comboboxItem CCCC
Junior combobox Company comboboxItem DDDD
Junior combobox Company comboboxItem HHHH
一些注意事项:结果需要按照上面的顺序显示,这最终是从第一个结果集中lft1和lft2值的顺序派生出来的。此外,新数据库“Junior”或多或少是新组合“database”的任意名称
我可以想象在客户端级别解决这个问题的方法(逐行呈现每个项目),也可以让Larry使用Bob使用的相同查找,但是有没有一种方法可以使用基于集合的SQL实现这个结果集
谢谢我仍然不清楚您在问什么,但似乎您可以通过以下查询获得所需的结果集:
SELECT distinct 'Junior' as Database,
xType,
displayLabel,
child_xType,
child_displayLabel
FROM MyTable
ORDER BY displayLabel DESC, child_displayLabel ASC
更新:
在你最后一次评论之后,我仍然感到困惑,但请尝试一下
SELECT 'Junior' as Database,
xType,
displayLabel,
child_xType,
child_displayLabel
FROM MyTable
GROUP BY xType, displayLabel, child_xType, child_displayLabel
ORDER BY min(lft1), min(lft2)
@AbeMiessler Junior是结果“数据库”的新名称。这或多或少是武断的,如果不清楚的话,很抱歉。SQL在设计上是无序的——没有所谓的“文件顺序”。这意味着您可以对结果进行排序的唯一方法是在(最外面的)
SELECT
语句中指定它(例如,视图通常不能排序)。另外,null
对于排序顺序是未定义的(但通常默认为“最小”)。因此,您必须使用指定的排序列(尽管您不必将它们包含在结果集中)。谢谢,Abe。这个查询的问题是,它不一定会保留原始表的顺序,客户需要正确地呈现数据(即,它需要与我在原始问题中发布的结果集的顺序完全一致)。啊,我明白了。order by子句I是否只是为您添加了正确的顺序?@jamnap-您没有明确说明“保留顺序”的方式或含义。不,它不会(只是也测试了一下),因为第一个表中lft1和lft2列(从未显示的嵌套集表派生)的值保证了正确的顺序,不一定是标签的名称。@AbeMiessler几乎完美无瑕。我还有一些其他的要求,我可能在我的问题中没有提到,但是,您的(优秀的)orderby
子句应该能提供我完成其余问题所需要的+1和接受答案!