日期:2014-05-18 浏览次数:20658 次
表BOMT
产品P_CODE 物料 CODE 编号 BOMNO
KJ-1501-024 KJ-1501-024 KJ-1501-024
KJ-1501-024 ZA150102401 KJ-1501-024
ZA150102401 ZC150103101 ZA150102401
ZC150103101 PDA00082300 ZC150103101
PDA00082300 PBA00082300 PDA00082300
PBA00082300 POA00082300 PBA00082300
POA00082300 PMA01002000 POA00082300
ZA150102401 ZC150101300 ZA150102401
ZC150101300 POA02082200 ZC150101300
POA02082200 PMA01002000 POA02082200
PMA01002000 PMB00000100 PMA01002000
根据编号BOMNO KJ-1501-024 找到它的下接。要得到显示层次
他们关系是 CODE的上接是P_CODE,看下面给的数据就知道了。
(是物料清单那样的模式)
层次 产品 物料
1 KJ-1501-024 KJ-1501-024
2 KJ-1501-024 ZA150102401
3 ZA150102401 ZC150103101
4 ZC150103101 PDA00082300
5 PDA00082300 PBA00082300
6 PBA00082300 POA00082300
7 POA00082300 PMA01002000
3 ZA150102401 ZC150101300
4 ZC150101300 POA02082200
5 POA02082200 PMA01002000
5 PMA01002000 PMB00000100
以前别人给写过一个,但是部理想,因为层次显示不清楚。是乱的。也发问过,也有高手给过相关的资料,但是鄙人没拿才华,没理解。所以才重新发帖,希望各位帮帮忙。(大号没分,所以申请小号发帖)如果需求说的不是很明确的话,还请各位发问。谢谢!
BOM按节点排序应用实例
--------------------------------------
-- Author : htl258(Tony)
-- Date : 2010-04-23 02:37:28
-- Version:Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86)
-- Jul 9 2008 14:43:34
-- Copyright (c) 1988-2008 Microsoft Corporation
-- Developer Edition on Windows NT 5.1 <X86> (Build 2600: Service Pack 3)
-- Subject: BOM按节点排序应用实例
--------------------------------------
--实例1:
--> 生成测试数据表:tb
IF NOT OBJECT_ID('[tb]') IS NULL
DROP TABLE [tb]
GO
CREATE TABLE [tb]([id] INT,[code] NVARCHAR(10),[pid] INT,[name] NVARCHAR(10))
INSERT [tb]
SELECT 1,'01',0,N'服装' UNION ALL
SELECT 2,'01',1,N'男装' UNION ALL
SELECT 3,'01',2,N'西装' UNION ALL
SELECT 4,'01',3,N'全毛' UNION ALL
SELECT 5,'02',3,N'化纤' UNION ALL
SELECT 6,'02',2,N'休闲装' UNION ALL
SELECT 7,'02',1,N'女装' UNION ALL
SELECT 8,'01',7,N'套装' UNION ALL
SELECT 9,'02',7,N'职业装' UNION ALL
SELECT 10,'03',7,N'休闲装' UNION ALL
SELECT 11,'04',7,N'西装' UNION ALL
SELECT 12,'01',11,N'全毛' UNION ALL
SELECT 13,'02',11,N'化纤' UNION ALL
SELECT 14,'05',7,N'休闲装'
GO
--SELECT * FROM [tb]
-->SQL查询如下:
;WITH T AS
(
SELECT CAST(CODE AS VARCHAR(20)) AS CODE,*,
CAST(ID AS VARBINARY(MAX)) AS px
FROM tb AS A
WHERE NOT EXISTS(SELECT * FROM tb WHERE id=A.pid)
UNION ALL
SELECT CAST(B.CODE+A.CODE AS VARCHAR(20)),A.*,
CAST(B.px+CAST(A.ID AS VARBINARY) AS VARBINARY(MAX))
FROM tb AS A
JOIN T AS B
ON A.pid=B.id
)
SELECT Code,Name FROM T
ORDER BY px
/*
Code Name
-------------------- ----------
01 服装
0101 男装
010101 西装
01010101 全毛
01010102 化纤
010102 休闲装
0102 女装
010201 套装
010202 职业装
010203 休闲装
010204 西装
01020401 全毛
01020402 化纤
010205 休闲装
(14 行受影响)
*/
--实例2:
--> 生成测试数据表:tb
IF NOT OBJECT_ID('[tb]') IS NULL
DROP TABLE [tb]
GO
CREATE TABLE [tb]([id] INT,[parentid] INT,[categoryname] NVARCHAR(10))
INSERT [tb]
SELECT 1,0,'test1' UNION ALL
SELECT 2,0,'test2' UNION ALL
SELECT 3,1,'test1.1' UNION ALL
SELECT 4,2,'test2.1' UNION ALL
SELECT 5,3,'test1.1.1' UNION ALL
SELECT 6,1,'test1.2'
GO
--SELECT * FROM [tb]
-->SQL查询如下:
;WITH T AS
(
SELECT *,CAST(ID AS VARBINARY(MAX)) AS px
FROM tb AS A
WHERE NOT EXISTS(SELECT * FROM tb WHERE id=A.[parentid])
UNION ALL
SELECT A.*,CAST(B.px+CAST(A.ID AS VARBINARY) AS VARBINARY(MAX))