当前位置: 代码迷 >> Sql Server >> 查找子节点的父节点(一个字节点可有多个父节点)后更改排序的查询怎么做(在线)
  详细解决方案

查找子节点的父节点(一个字节点可有多个父节点)后更改排序的查询怎么做(在线)

热度:35   发布时间:2016-04-24 09:57:27.0
查找子节点的父节点(一个字节点可有多个父节点)后更改排序的查询如何做(在线)
本帖最后由 cqqjzb 于 2014-09-18 16:55:20 编辑
我用CET递归做了查询结果如下
dj                      zch                          ljh                   ljmc                     zpgw
2    2180102003   0730303010   前端盖及附件总成     OP1140
1    2017000                      2180102003    1 0TD1600
2    2180107003   0730303010   顶盖总成                OP1270W
1    2017000                      2180107003   10TD1600
2    2200131001   0730303010   变速器后盖总成
1   2014000                      2200131001   12TDS2000         NULL
2   2222102002   0730303010   前端盖及附件总成
1   2014000                       2222102002    12TDS2000        NULL
 我想实现以下显示:

dj                      zch                          ljh                   ljmc                     zpgw
2    2180102003      0730303010   前端盖及附件总成 OP1140
2    2180107003      0730303010   顶盖总成            OP1270W
1    2017000                         2180102003    1 0TD1600
2    2200131001      0730303010   变速器后盖总成
2    2222102002      0730303010   前端盖及附件总成
1   2014000                         2222102002    12TDS2000 NULL
这个能用SQL实现么?不想写存储过程和用cursor

------解决思路----------------------
你不贴表,我就把你的第一个结果当数据源了
你参考一下
--模拟数据表
IF OBJECT_ID('TempDB..#TB',N'U') IS NOT NULL
DROP TABLE #TB
GO
CREATE TABLE TempDB..#TB(
zch VARCHAR(100)
,ljh VARCHAR(100)
,ljmc VARCHAR(100)
,zpgw VARCHAR(100)
)
GO
INSERT INTO #TB
SELECT '2180102003','0730303010','前端盖及附件总成','OP1140'
UNION ALL
SELECT '2017000','2180102003','10TD1600',''
UNION ALL
SELECT '2180107003','0730303010','顶盖总成','OP1270W'
UNION ALL
SELECT '2017000','2180107003','10TD1600',''
UNION ALL
SELECT '2200131001','0730303010','变速器后盖总成',''
UNION ALL
SELECT '2014000','2200131001','12TDS2000',NULL
UNION ALL
SELECT '2222102002','0730303010','前端盖及附件总成',''
UNION ALL
SELECT '2014000','2222102002','12TDS2000',NULL
GO

--语句开始
WITH CTE AS(
SELECT A.zch,A.ljmc,A.zpgw,B.zch PID FROM #TB A LEFT JOIN #TB B ON A.zch=B.ljh GROUP BY A.zch,A.ljmc,A.zpgw,B.zch
)
,CTETB AS(
SELECT
A.*,ISNULL(C.zch,D.ljh) ljh
FROM CTE A
OUTER APPLY (SELECT TOP 1 B.zch FROM CTE B WHERE A.zch=B.PID)C
LEFT JOIN #TB D ON C.zch IS NULL AND A.zch=D.zch
)
,CET AS(
SELECT 1 dj,zch,ljh,ljmc,zpgw,CAST(zch AS VARCHAR(8000)) [PATH] FROM CTETB WHERE PID IS NULL
UNION ALL
SELECT
B.dj+1,A.zch,A.ljh,A.ljmc,A.zpgw,B.[PATH]+'-'+B.zch
FROM
CTETB A
INNER JOIN CET B ON A.PID=B.zch
)
SELECT dj,zch,ljh,ljmc,zpgw FROM CET ORDER BY [PATH] DESC,zch
--语句结束

2 2180102003 0730303010 前端盖及附件总成 OP1140
2 2180107003 0730303010 顶盖总成 OP1270W
1 2017000 2180102003 10TD1600
2 2200131001 0730303010 变速器后盖总成
2 2222102002 0730303010 前端盖及附件总成
1 2014000 2200131001 12TDS2000 NULL
  相关解决方案