数据示例:
ID Name ParentID
1 parent-1 NULL
2 parent-2 NULL
3 sub 1
4 child-1-1 3
5 child-1-2 1
6 child-2-1 2
现在如果我搜索名称'%child-1%',我想要以下记录:上面数据中的第1行,第3行,第4行和第5行。我可以写什么样的存储过程来返回我的行?
我的想法是如果我搜索文本,它将继续从表中选择记录,直到parentID为空。所以如果我喜欢搜索'child-1',基本的sql查询会返回Row-4和Row-5。但是我的程序在循环中检查了Row-4是否为parentid而非null,因此它得到一行ID = parentid的row-4为3.现在它得到一行ID = parentid of row-3是1并获得第1行。现在,row-1的parentd为NULL,因此它会停止。
我正在使用此存储过程在树视图中实现搜索功能,我希望在搜索后保留父子层次结构。
到目前为止,我已经尝试了这个,但我是存储过程的新手:
USE DBname
Go
DECLARE @ParentID int
Declare @myresultset Cursor
Set @myresultset = CURSOR for Select ParentID from mytable where Name like 'child-1%'
OPEN @myresultset
Fetch NEXT from @myresultset
into @ParentID
While @@Fetch_Status=0
Begin
While @ParentID is not NULL
Begin
Select @ParentID = ParentID from mytable where ID=@ParentID
Select distinct * from mytable where ID=@ParentID
End
Fetch Next from @myresultset
into @ParentID
End
close @myresultset
答案 0 :(得分:4)
我没有使用过程代码对此进行编码,而是使用面向集合的SQL重新编码。我正在使用递归CTE来找到给定孩子的“父母”。这是我的存储过程:
CREATE PROC find_parents (@childname varchar(20)) as
;WITH heirarchy_cte (ID, Name, ParentID, Level) as
(SELECT e.ID, e.Name, e.ParentID, 0 as Level
FROM mytable as e
where e.Name like @childname
UNION ALL
SELECT e.ID, e.Name, e.ParentID, Level+1
FROM mytable as e
INNER JOIN heirarchy_cte as h
ON h.ParentID=e.ID
)
SELECT DISTINCT ID, Name, ParentID
FROM heirarchy_cte
ORDER BY ID
然后我用:
运行它exec find_parents @childname='child-1%'
如果我的结果是正确的,那么此解决方案应该针对更大量的数据进行更好的扩展。我还将其编码为您所指示的存储过程。
要查看完整代码,请参阅SQL小提琴: Find Parents SQL Fiddle Demo
如果我的解决方案是正确的,请将其标记为答案。感谢。
答案 1 :(得分:0)
试试这个简单的例子
CREATE PROCEDURE proc (
IN i INTEGER,
IN j INTEGER)
BEGIN
DECLARE z integer;
set z=i;
while (z<j) do
begin
set z=z+1;
end;
end while;
END;