6

数据示例:

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

现在,如果我搜索 Name like '%child-1%',我想要以下记录:上述数据中的第 1 行、第 3 行、第 4 行和第 5 行。如果我可以编写返回不同行的存储过程会怎样?

我的想法是如果我搜索文本,它将继续从表中选择记录,直到 parentID 为空。因此,如果我对“child-1”进行类似搜索,则基本 sql 查询将返回第 4 行和第 5 行。但是我的程序在一个循环中检查第 4 行的 parentid 不为空,因此它得到一个 ID= 第 4 行的 parentid 为 3 的行。现在它得到一个 ID = 第 3 行的 parentid 的行为 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
4

2 回答 2

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 Fiddle: Find Parents SQL Fiddle Demo

如果我的解决方案是正确的,请将其标记为答案。谢谢。

于 2013-04-22T02:42:30.690 回答
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;
于 2016-02-26T10:00:34.170 回答