2013-04-19 100 views
6
數據

例子:SQL存儲過程,而循環

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 

現在,如果我要尋找的名稱,如 '%兒童1%',我想下面的記錄:行1,行-3,行-4和第5行以上數據。什麼樣的存儲過程,我可以寫,返回我disctinct行?

我的想法是如果我搜索文本,它將繼續從表中選擇記錄,直到parentID爲空。所以如果我像搜索'child-1'一樣,基本的SQL查詢返回第4行和第5行。但是我的程序在檢查一個循環中檢查了Row-4的parentid,它不是null,所以它得到了一行ID = 4的row-4,它是3.現在它得到一行ID = parentid的第3行是1並獲得第1行。現在行1的父項爲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 [email protected] 
    Select distinct * from mytable where [email protected] 
    End 
Fetch Next from @myresultset 
into @ParentID 
End 
close @myresultset 

回答

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

如果我的解決方案是正確的,請把它標記爲答案。謝謝。

+0

感謝邁克爾Harmon..Thanks的代碼。它工作完美。再次感謝您的幫助。 – user2272865 2013-04-22 03:41:14

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;