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

「%child-1%」のような名前を検索すると、上記のデータの Row-1、Row-3、Row-4、および Row-5 のレコードが必要になります。個別の行を返すストアド プロシージャを記述できるとしたら、どのようなものですか?

私の考えは、テキストを検索すると、parentID が null になるまでテーブルからレコードを選択し続けることです。したがって、「child-1」のような検索を行うと、基本的な SQL クエリは Row-4 と Row-5 を返します。しかし、私の手順は、Row-4にnullではないparentidがあることをループでチェックするため、行4のID = parentidが3の行を取得します。は 1 で、row-1 を取得します。現在、row-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 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 に答える