表的结构如下:
Sign 表示地点;PJ1 标识合同号;TI1 标识行号;NO 标识具体包装箱号;TYPE标识分类
表的意思为发往地点L1处的包装箱有一个,即A1,A1的标识为Panel.
在A1中装有CB/CT1/PT1等物料.标识的+/++标识层次关系.现在需要找出没有包装箱层(即标识为+,Type为Panel)而存在下层的物料,如本例中的
L3         P02  100               SB
++          P01  201     A1      CB
++          P01  201     A1      CT1
++          P01  201     A1      PT1表内容如下:(数据库为sql 2000)
Sign      PJ1   TI1   No     Type
L1          P01  100               SB
+            P01  101     A1      Panel
++          P01  101     A1      CB
++          P01  101     A1      CT1
++          P01  101     A1      PT1
L2         P01  200               SB
+            P01  201     A1      Panel
++          P01  201     A1      CB
++          P01  201     A1      CT1
++          P01  201     A1      PT1
L3         P02  100               SB
++          P01  201     A1      CB
++          P01  201     A1      CT1
++          P01  201     A1      PT1

解决方案 »

  1.   

    你该说一下 表的主键和索引。要不然我怎么判断 一条记录的唯一性。。比如说
    这条记录
    ('L1','P01','100','','SB')
    为什么在('+','P01','101','A1','Panel') 的上边。有什么可以标示。
      

  2.   

    是TYPE 决定了上下关系.Sign      PJ1  TI1  No    Type 
    L1          P01  100              SB 
    +            P01  101    A1      Panel 
    ++          P01  101    A1      CB 
    ++          P01  101    A1      CT1 
    ++          P01  101    A1      PT1 Type 为SB的是最上层,然后依次是panel/cb/ct1/pt1
      

  3.   

    表中应该少了类似parentid一列,如何判断L2和L1后面的++前面有包装箱层呢?
    目前表还不能找到相应的规则,所以语句就不好写了。
      

  4.   


    ---找出子目录作为参拷--测试数据
    CREATE TABLE tb(ID char(3),PID char(3),Name nvarchar(10))
    INSERT tb SELECT '001',NULL ,'山东省'
    UNION ALL SELECT '002','001','烟台市'
    UNION ALL SELECT '004','002','招远市'
    UNION ALL SELECT '003','001','青岛市'
    UNION ALL SELECT '005',NULL ,'四会市'
    UNION ALL SELECT '006','005','清远市'
    UNION ALL SELECT '007','006','小分市'
    GO--查询指定节点及其所有子节点的函数
    CREATE FUNCTION f_Cid(@ID char(3))
    RETURNS @t_Level TABLE(ID char(3),Level int)
    AS
    BEGIN
    DECLARE @Level int
    SET @Level=1
    INSERT @t_Level SELECT @ID,@Level
    WHILE @@ROWCOUNT>0
    BEGIN
    SET @Level=@Level+1
    INSERT @t_Level SELECT a.ID,@Level
    FROM tb a,@t_Level b
    WHERE a.PID=b.ID
    AND b.Level=@Level-1
    END
    RETURN
    END
    GO--调用函数查询002及其所有子节点
    SELECT a.*
    FROM tb a,f_Cid('002') b
    WHERE a.ID=b.ID
    /*--结果
    ID   PID  Name       
    ------ ------- ---------- 
    002  001  烟台市
    004  002  招远市
    --*/
    -- 2005 及之后的版本
    create table treeList( 
    nodeID int  IDENTITY, --节点ID 
    nodeName varchar(20), --节点名称 
    partId int --父节点 

    insert into treeList(nodeName,partID) 
    select  '节点1' ,0  --一级节点 
    union all select '节点2',1 --二级节点 
    union all select '节点3',1 --二级节点 
    union all select '节点4',2 --三级节点 
    union all select '节点5',2 --三级节点 
    union all select '节点6',3 --三级节点 
    union all select '节点7',4 --四级节点 
    union all select '节点8',4 --四级节点 
    union all select '节点9',5 --四级节点 
    GODECLARE
    @nodeID int;
    SET @nodeID = 1; -- 要查询的节点
    WITH
    TREE AS(
    SELECT
    *,
    level = 0,
    path = CONVERT(varchar(8000), RIGHT(10000 + nodeID, 4))
    FROM treeList
    WHERE nodeID = @nodeID
    UNION ALL
    SELECT
    A.*,
    level = B.level + 1,
    path = B.path 
    + CONVERT(varchar(8000), RIGHT(10000 + A.nodeID, 4))
    FROM treeList A,
    TREE B
    WHERE A.partId = B.nodeID
    )
    SELECT
    SPACE(3 * level) + N'|-- ' + nodeName,
    *
    FROM TREE
    ORDER BY path;
    GODROP TABLE treeList;
      

  5.   

    /*
    添加一个主键ID来标识行
    rea: 先把有上级的取出来,再吧剩余的取出来就可以了
    */
    select *
    from YourTable
    where ID not in
    (
    select A.ID
    from YourTable A,YourTable B
    where A.Sign='+' and B.Sign='++' and
    A.PJ1 = B.PJ1 and A.TI1 = B.TI1 and
    A.No = B.No
    )