日期:2014-05-17  浏览次数:20663 次

树形结构 层次结构 BOM结构 死循环 如何检测
BOM 死循环如何检测问题,如下,如何检测循环A—D—F—A    
BOM结构(料号1、料号2、品名1、品名2、单位用量、....等等字段)
料号1(上阶) 料号2(下阶)
A B
A C
A D
D E
D F
D G
F A
F H


CSDN查阅过其他资料:http://blog.csdn.net/htl258/article/details/5456223
但是料号的字段有可能是6位或者7位,也就是不固定的,所以不大适合,不知道各位有什么其他更好的方法,我想写在存储过程中
存储过程 死循环 BOM结构 层次结构 树形结构

------解决方案--------------------
--> 测试数据:#tb
IF OBJECT_ID('TEMPDB.DBO.#tb') IS NOT NULL DROP TABLE #tb
GO 
CREATE TABLE #tb([父节点] VARCHAR(1),[节点] VARCHAR(1))
INSERT #tb
SELECT NULL,'A' UNION ALL
SELECT 'A','B' UNION ALL
SELECT 'A','C' UNION ALL
SELECT 'A','D' UNION ALL
SELECT 'D','E' UNION ALL
SELECT 'D','F' UNION ALL
SELECT 'D','G' UNION ALL
SELECT 'F','A' UNION ALL
SELECT 'F','H'
--------------开始查询--------------------------

SELECT [节点] FROM #tb GROUP BY [节点] HAVING COUNT(*)>1
----------------结果----------------------------
/* 
节点
A
*/

------解决方案--------------------
BOM多层,通常是作层次控制,比如超过20报错即可
------解决方案--------------------
引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:

--> 测试数据:#tb
IF OBJECT_ID('TEMPDB.DBO.#tb') IS NOT NULL DROP TABLE #tb
GO 
CREATE TABLE #tb([父节点] VARCHAR(1),[节点] VARCHAR(1))
INSERT #tb
SELECT NULL,'A' UNION ALL
SELECT 'A','B' UNION ALL
SELECT 'A','C' UNION ALL
SELECT 'A','D' UNION ALL
SELECT 'D','E' UNION ALL
SELECT 'D','F' UNION ALL
SELECT 'D','G' UNION ALL
SELECT 'F','A' UNION ALL
SELECT 'F','H'
--------------开始查询--------------------------

SELECT [节点] FROM #tb GROUP BY [节点] HAVING COUNT(*)>1
----------------结果----------------------------
/* 
节点
A
*/


你这样好像也不可行呢,如果节点G下面有H和I子节点呢?这样变成H也存在循环了.....实际H应该不是循环吧

这种情况的话,需要用游标去遍历了
原理应该是那些下级包含有自己的都是错的。



哎,我只想到一个笨方法了,类似您说的,使用游标遍历,将每个子节点和其所有的父节点插入一个临时表中,每次插入前,检查是否存在其所对应的父节点中......只是这样耗时多点,暂时没有其他办法了......

我也想不到更好的。呵呵