请教给union all查询结果按父子关系排序,让子层按时间倒序跟在父层后面,请教该如何改?_MSSQL_编程问答

请教给union all查询结果按父子关系排序,让子层按时间倒序跟在父层后面,请教该如何改?

来源:互联网  时间:2018/1/22 12:43:19

关于网友提出的“ 请教给union all查询结果按父子关系排序,让子层按时间倒序跟在父层后面,请教该如何改?”问题疑问,本网通过在网上对“ 请教给union all查询结果按父子关系排序,让子层按时间倒序跟在父层后面,请教该如何改?”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:

问题: 请教给union all查询结果按父子关系排序,让子层按时间倒序跟在父层后面,请教该如何改?

解决方案1:

引用 4 楼 QQ154485585 的回复:
不好意思,可能是我没说明白,再描述下问题:
加了一条id为009的数据,pid为007,希望它跟在它父id对应项后,也就是想让009出现在007的后面
 请教给union all查询结果按父子关系排序,让子层按时间倒序跟在父层后面,请教该如何改?
IF OBJECT_ID('tempdb..#tab') IS NOT NULL
    DROP TABLE #tab
CREATE TABLE #tab(
    id VARCHAR(20),
    pid VARCHAR(20),
    txt VARCHAR(20),
    dt date   
)   
INSERT INTO #tab
SELECT '1',null,'aaa','2017-11-05' UNION ALL
SELECT '007','1','aaa','2017-11-05' UNION ALL
SELECT '005','1','aaa','2017-11-06' UNION ALL
SELECT '2',null,'aaa','2017-11-05' UNION ALL
SELECT '008','2','aaa','2017-11-05' UNION ALL
SELECT '009','007','aaa','2017-11-05'
--测试数据结束
  
;WITH cte AS (
    SELECT *,id  AS rn FROM #tab WHERE ISNULL(pid,'')=''
    UNION ALL
    SELECT a.*,b.rn FROM #tab a
    INNER JOIN cte b ON a.pid=b.id   
)
SELECT * FROM cte ORDER BY rn,pid,dt desc
Quote: 引用 3 楼 qq_37170555 的回复:

Quote: 引用 2 楼 QQ154485585 的回复:

以上方法确实欠妥,修改了下

IF OBJECT_ID('tempdb..#tab') IS NOT NULL
    DROP TABLE #tab
CREATE TABLE #tab(
    id VARCHAR(20),
    pid VARCHAR(20),
    txt VARCHAR(20),
    dt date   
)   
INSERT INTO #tab
SELECT '1',null,'aaa','2017-11-05' UNION ALL
SELECT '007','1','aaa','2017-11-05' UNION ALL
SELECT '005','1','aaa','2017-11-06' UNION ALL
SELECT '2',null,'aaa','2017-11-05' UNION ALL
SELECT '008','2','aaa','2017-11-05'
--测试数据结束
 
;WITH cte AS (
    SELECT *,id  AS rn FROM #tab WHERE ISNULL(pid,'')=''
    UNION ALL
    SELECT a.*,b.rn FROM #tab a
    INNER JOIN cte b ON a.pid=b.id   
)
SELECT * FROM cte ORDER BY rn,pid,dt desc

引用 3 楼 qq_37170555 的回复:
Quote: 引用 2 楼 QQ154485585 的回复:

以上方法确实欠妥,修改了下

IF OBJECT_ID('tempdb..#tab') IS NOT NULL
    DROP TABLE #tab
CREATE TABLE #tab(
    id VARCHAR(20),
    pid VARCHAR(20),
    txt VARCHAR(20),
    dt date   
)   
INSERT INTO #tab
SELECT '1',null,'aaa','2017-11-05' UNION ALL
SELECT '007','1','aaa','2017-11-05' UNION ALL
SELECT '005','1','aaa','2017-11-06' UNION ALL
SELECT '2',null,'aaa','2017-11-05' UNION ALL
SELECT '008','2','aaa','2017-11-05'
--测试数据结束
 
;WITH cte AS (
    SELECT *,id  AS rn FROM #tab WHERE ISNULL(pid,'')=''
    UNION ALL
    SELECT a.*,b.rn FROM #tab a
    INNER JOIN cte b ON a.pid=b.id   
)
SELECT * FROM cte ORDER BY rn,pid,dt desc

上面那个只能用在两层关系上,多层就不行了,不过下面这个可以(虽然还是有点缺陷,但是基本上没太大问题了。)

IF OBJECT_ID('tempdb..#tab') IS NOT NULL
    DROP TABLE #tab
CREATE TABLE #tab(
    id VARCHAR(20),
    pid VARCHAR(20),
    txt VARCHAR(20),
    dt date   
)   
INSERT INTO #tab
SELECT '1',null,'aaa','2017-11-05' UNION ALL
SELECT '007','1','aaa','2017-11-05' UNION ALL
SELECT '005','1','aaa','2017-11-06' UNION ALL
SELECT '2',null,'aaa','2017-11-05' UNION ALL
SELECT '009','005','aaa','2017-11-05' UNION ALL
SELECT '010','007','aaa','2017-11-05' UNION ALL
SELECT '008','2','aaa','2017-11-05'
--测试数据结束
  
;WITH cte AS (
    SELECT *,convert(nVARCHAR(20), ROW_NUMBER() OVER(ORDER BY  id) ) AS rn FROM #tab WHERE ISNULL(pid,'')=''
    UNION ALL
    SELECT a.*,convert(nVARCHAR(20),b.rn+cast(ROW_NUMBER() OVER(ORDER BY a.id) AS VARCHAR(20))) FROM #tab a
    INNER JOIN cte b ON a.pid=b.id   
)
SELECT * FROM cte ORDER BY rn,pid,dt desc

 请教给union all查询结果按父子关系排序,让子层按时间倒序跟在父层后面,请教该如何改?
  • CSS:margin重叠-父子关系

上一篇怎么关闭sql server 查询后用减号生成的字段名与字段值的分割行
下一篇关于with(nolock)的小问题
明星图片
相关文章
《 请教给union all查询结果按父子关系排序,让子层按时间倒序跟在父层后面,请教该如何改?》由码蚁之家搜集整理于网络,
联系邮箱:mxgf168#qq.com(#改为@)