BOMMD
MD001(主件品号),MD003 元件
H AA B
A CB C
B D我想查询出来的树是这样的效果H A
A B
B C
B D
A C
也就是说,如果元件还有BOM,那么下阶直接在他下面展示
因为B还有下阶,所以在他的下面,直接将B开头的在B下面展开,如果C下面有BOM,同样的就在右边出现C的下一行显示B的BOM特别强调,不要以下效果
H A
A B
A C
B C
B D
MD001(主件品号),MD003 元件
H AA B
A CB C
B D我想查询出来的树是这样的效果H A
A B
B C
B D
A C
也就是说,如果元件还有BOM,那么下阶直接在他下面展示
因为B还有下阶,所以在他的下面,直接将B开头的在B下面展开,如果C下面有BOM,同样的就在右边出现C的下一行显示B的BOM特别强调,不要以下效果
H A
A B
A C
B C
B D
----------------------
你这数据是错的吧?
C怎么可以同时对应A,又对应B呢?
如果只有三层。可以用游标来实现:
create table bommd(md001 varchar(10),md003 varchar(3))
insert into bommd select 'H','A'
insert into bommd select 'A','B'
insert into bommd select 'A','C'
insert into bommd select 'B','D'
insert into bommd select 'B','E'
insert into bommd select 'C','F'
insert into bommd select 'C','G'
declare @md001 varchar(10)
declare @md003 varchar(10)
declare @temp table(md001 varchar(10),md003 varchar(3))
insert into @temp select * from bommd a where not exists(select * from bommd where md003=a.md001)--根节点
declare cur cursor for select * from bommd where md001 =(select md003 from @temp)
open cur
fetch next from cur into @md001,@md003
while(@@fetch_status=0)
begin
insert into @temp values (@md001,@md003)
if exists(select * from bommd where md001=@md003)
begin
insert into @temp select * from bommd where md001=@md003
end
fetch next from cur into @md001,@md003
end
close cur
deallocate cur
select * from @temp
例如:
C=螺丝
B=光驱
A=电脑
可以同时用到呀
CREATE TABLE T
(
MD001 VARCHAR(20),
MD003 VARCHAR(20)
)INSERT INTO T
SELECT 'H','A' UNION ALL
SELECT 'A','B' UNION ALL
SELECT 'A','C' UNION ALL
SELECT 'B','C' UNION ALL
SELECT 'B','D'GOCREATE FUNCTION F_SORT()
RETURNS @t TABLE (T_ID INT IDENTITY(1,1),ID VARCHAR(20) ,M01 VARCHAR(20),M02 VARCHAR(20), LVL INT)
AS
BEGIN
DECLARE @i INT
SET @i = 0
INSERT INTO @t(M01,M02,LVL)
SELECT *,@i FROM t A WHERE NOT EXISTS ( SELECT * FROM t WHERE MD003 = A.MD001)
UPDATE A SET ID = (SELECT RIGHT(100000+COUNT(1),2) FROM @t WHERE T_ID<A.T_ID)
FROM @t A
WHILE EXISTS ( SELECT * FROM @t A,t B WHERE A.M02 = B.MD001 AND A.LVL = @i)
BEGIN
INSERT INTO @t
SELECT A.ID,B.*,@i+1 FROM @t A,t B WHERE A.M02 = B.MD001 AND A.LVL = @i
UPDATE A SET ID = ID+(SELECT RIGHT(100000+COUNT(1),2) FROM @t WHERE T_ID<A.T_ID)
FROM @t A WHERE LVL = @i+1
SET @i = @i + 1
END
RETURN
END
GOSELECT M01,M02 FROM DBO.F_SORT() ORDER BY ID DROP FUNCTION F_SORT
DROP TABLE TM01 M02
-------------------- --------------------
H A
A B
B C
B D
A C(所影响的行数为 5 行)
H A
A B
B C
B D
A C
A B
B C
B D
A C
B C
B D
create table bommd(md001 varchar(10),md003 varchar(10))
insert into bommd select 'H','A'
insert into bommd select 'A','B'
insert into bommd select 'A','C'
insert into bommd select 'B','D'
insert into bommd select 'B','E'
insert into bommd select 'C','F'
insert into bommd select 'C','G'go
DECLARE @T table(md001 varchar(10),md003 varchar(10),lev int,[Order] varchar(8000))
DECLARE @lev int
SET @Lev=0
INSERT @T SELECT md001,md003,@Lev,md001
FROM bommd t
WHERE not exists(select 1 from bommd where md003=t.md001)
WHILE @@ROWCOUNT>0
BEGIN
SET @Lev=@Lev+1
INSERT @T SELECT a.md001,a.md003,@Lev,b.[Order]+a.md001
FROM bommd a,@T b
WHERE a.md001=b.md003
AND b.Lev=@Lev-1
ENDSELECT a.md001,a.md003
FROM bommd a,@T b
WHERE a.md001=b.md001
group by a.md001,a.md003,b.[Order]
ORDER BY b.[Order](所影响的行数为 1 行)
(所影响的行数为 2 行)
(所影响的行数为 4 行)
(所影响的行数为 0 行)md001 md003
---------- -----
H A
A B
A C
B D
B E
C F
C G(所影响的行数为 7 行)
create table bommd(md001 varchar(10),md003 varchar(10))
insert into bommd select 'H','A'
insert into bommd select 'A','B'
insert into bommd select 'A','C'
insert into bommd select 'B','D'
insert into bommd select 'B','E'
insert into bommd select 'C','F'
insert into bommd select 'C','G'go
DECLARE @T table(md001 varchar(10),md003 varchar(10),lev int,[Order] varchar(8000))
DECLARE @lev int
SET @Lev=0
INSERT @T SELECT md001,md003,@Lev,md001+md003
FROM bommd t
WHERE not exists(select 1 from bommd where md003=t.md001)
WHILE @@ROWCOUNT>0
BEGIN
SET @Lev=@Lev+1
INSERT @T SELECT a.md001,a.md003,@Lev,b.[Order]+a.md003
FROM bommd a,@T b
WHERE a.md001=b.md003
AND b.Lev=@Lev-1
ENDSELECT a.md001,a.md003
FROM bommd a,@T b
WHERE a.md003=b.md003
group by b.[Order],a.md001,a.md003
ORDER BY b.[Order](所影响的行数为 1 行)
(所影响的行数为 2 行)
(所影响的行数为 4 行)
(所影响的行数为 0 行)md001 md003
---------- -----
H A
A B
B D
B E
A C
C F
C G(所影响的行数为 7 行)