表的结构如下:
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
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
这条记录
('L1','P01','100','','SB')
为什么在('+','P01','101','A1','Panel') 的上边。有什么可以标示。
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
目前表还不能找到相应的规则,所以语句就不好写了。
---找出子目录作为参拷--测试数据
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;
添加一个主键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
)