Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 按日期降序排列父行,子行在每个行下独立排列_Sql_Sql Server 2008_Sql Order By_Inner Join_Common Table Expression - Fatal编程技术网

Sql 按日期降序排列父行,子行在每个行下独立排列

Sql 按日期降序排列父行,子行在每个行下独立排列,sql,sql-server-2008,sql-order-by,inner-join,common-table-expression,Sql,Sql Server 2008,Sql Order By,Inner Join,Common Table Expression,这是我的表模式的一个人为版本,用于说明我的问题: QuoteID,详细信息,创建日期,模型QuoteID 其中,QuoteID是主键,ModelQuoteID是返回到此表的可为空外键,以表示根据另一个quote建模的quote(随后可能会更改其详细信息列等) 我需要返回一个按日期降序排列的报价列表,但建模报价除外,它应该位于其父报价的下方,在任何其他同级报价中按日期降序排列(报价只能建模一级) 例如,如果我有以下4行引号: 1, 'Fix the roof', '01/01/2012', nul

这是我的表模式的一个人为版本,用于说明我的问题:

QuoteID,详细信息,创建日期,模型QuoteID

其中,QuoteID是主键,ModelQuoteID是返回到此表的可为空外键,以表示根据另一个quote建模的quote(随后可能会更改其详细信息列等)

我需要返回一个按日期降序排列的报价列表,但建模报价除外,它应该位于其父报价的下方,在任何其他同级报价中按日期降序排列(报价只能建模一级)

例如,如果我有以下4行引号:

1, 'Fix the roof', '01/01/2012', null
2, 'Clean the drains', '02/02/2012', null
3, 'Fix the roof and door', '03/03/2012', 1
4, 'Fix the roof, door and window', '04/04/2012', 1
5, 'Mow the lawn', '05/05/2012', null
然后我需要按以下顺序返回结果:

5 - Mow the lawn
2 - Clean the drains
1 - Fix the roof
4 - -> Fix the roof, door and window
3 - -> Fix the roof and door
我还传递搜索条件,例如用于详细信息的关键字,并返回建模的引号,即使它们不包含搜索词,但它们的父引号包含。我已经让该部分使用一个公共表表达式来获取原始引号,并为建模的引号联合一个连接

这很好地工作,但目前我必须将建模的引号重新排列成正确的代码顺序。这并不理想,因为我的下一步是在SQL中实现分页,如果当时行没有正确分组,那么我就不会让当前页面中的子元素在代码中进行重新排序。一般来说,它们会自然地组合在一起,但并不总是如此。您可以在今天为一个月前的报价创建模型报价

我在这方面花了不少时间,有SQL专家能帮我吗?非常感谢

编辑:这是我的SQL的一个精心设计的版本,适合我精心设计的示例:-)

观看奥运会——只是浏览了一下你的帖子——看起来你想控制每个级别(根和中的一个级别)的排序,并确保返回的数据是直接在其父级下面的子级(这样你就可以分页数据…)。我们一直都这样做。您可以在每个内部查询中添加一个
orderby
,并创建一个
sort
列。我设计了一个稍微不同的例子,你可以很容易地将其应用到你的环境中。我将根升序和一级降序排序,只是为了说明如何控制每个部分

declare @tbl table (id int, parent int, name varchar(10))

insert into @tbl (id, parent, name)
values (1, null, 'def'), (2, 1, 'this'), (3, 1, 'is'), (4, 1, 'a'), (5, 1, 'test'),
       (6, null, 'abc'), (7, 6, 'this'), (8, 6, 'is'), (9, 6, 'another'), (10, 6, 'test')

;with cte (id, parent, name, sort) as (
  select id, parent, name, cast(right('0000' + cast(row_number() over (order by name) as varchar(4)), 4) as varchar(1024))
  from   @tbl
  where  parent is null

  union all

  select t.id, t.parent, t.name, cast(cte.sort + right('0000' + cast(row_number() over (order by t.name desc) as varchar(4)), 4) as varchar(1024))
  from   @tbl t inner join cte on t.parent = cte.id
)
select * from cte
order by sort
这将产生以下结果:

id    parent    name     sort
----  --------  -------  ----------
6     NULL      abc      0001
7     6         this     00010001
10    6         test     00010002
8     6         is       00010003
9     6         another  00010004
1     NULL      def      0002
2     1         this     00020001
5     1         test     00020002
3     1         is       00020003
4     1         a        00020004

您可以看到根节点按升序排列,内部节点按降序排列。

酷,干杯!我可以适应。你可以通过奥林匹亚1000分的成绩!
id    parent    name     sort
----  --------  -------  ----------
6     NULL      abc      0001
7     6         this     00010001
10    6         test     00010002
8     6         is       00010003
9     6         another  00010004
1     NULL      def      0002
2     1         this     00020001
5     1         test     00020002
3     1         is       00020003
4     1         a        00020004