2016-07-22 2 views
0

(Oracleを使用して)階層的なSQLクエリに苦労しています。ユニークなIDを持つウィジェットのテーブルがあるとします。ウィジェットは一度だけコピーでき、新しいウィジェットから親IDを追跡します。例えば、私が表示されるクエリを作成しようとしているSQL階層クエリ:すべての親子のIDを指定してフルツリーを検索する(Oracle)

(102と104は単なるダミーデータである)105

、その後、103その後、ウィジェット100をコピーして、ウィジェット101になります
id parent_id 
100 
101 100 
102 
103 101 
104 
105 103 

CREATE TABLE WIDGETS (ID NUMBER NOT NULL, PARENT_ID NUMBER); 
INSERT INTO WIDGETS (ID, PARENT_ID) VALUES (100, null); 
INSERT INTO WIDGETS (ID, PARENT_ID) VALUES (101, 100); 
INSERT INTO WIDGETS (ID, PARENT_ID) VALUES (102, null); 
INSERT INTO WIDGETS (ID, PARENT_ID) VALUES (103, 101); 
INSERT INTO WIDGETS (ID, PARENT_ID) VALUES (104, null); 
INSERT INTO WIDGETS (ID, PARENT_ID) VALUES (105, 103); 

を言うことができますウィジェットの完全な履歴、関係のIDのいずれかを使用します。

だから私は、クエリに '103' のID(または '100' ...か '105')を与えれば、私は、クエリは、このような何かを返すことを期待したい:

id parent_id  
100 
101 100 
103 101 
105 103 

I CONNECT BY PRIORを使ってみましたが、startで始めるにはIDで始める必要があります。

select parent_id as from_id, id as to_id 
from WIDGETS 
start with id = 100 
CONNECT BY PRIOR id = parent_id; 

from_id to_id 
null  100 
100  101 
101  103 
103  105 

しかし、私は必ずしもidの開始を知っていないものであれば:たとえば、私は、クエリに元のIDを与える完全なツリーを表示することができますか?起源IDを見つけてそこから完全な木を得ることは可能ですか?

答えて

1

葉に当たるまで、ツリーを後方に横断して開始点を計算します。 SELECT parent_id AS from_id, ID AS to_id FROM WIDGETS START WITH ID = (SELECT ID FROM WIDGETS WHERE CONNECT_BY_ISLEAF=1 START WITH ID = 105 CONNECT BY ID = PRIOR parent_id ) CONNECT BY PRIOR ID = parent_id;

+1

あなたは '='それもペア(101、104)を追加することで対応でしょう 'IN IDで始まり'へのIDで始まるを変更した場合:それは役に立てば幸い、これを試してみてください。 – Unoembre

+0

これは私が探していたものです。ありがとうございます。 – a3uge

-1

@Inputは、ストアドプロシージャに渡す入力IDです。

DECLARE @Parent int; 

WHILE (Select @Parent = PARENT_ID From Widgets Where ID = @Input) Is NOT NULL 
BEGIN 
Set @Input = @Parent 
END 
Set @Parent = @Input 

declare @Hierarchy table(Member int) 
INSERT INTO @Hierarchy(Member) Values (@Parent) 
WHILE (Select @Input = ID From Widgets Where PARENT_ID = @Parent) Is NOT NULL 
BEGIN 
SET @Parent = @Input 
INSERT INTO @Hierarchy(Member) Values (@Parent) 
END 

Select * From @Hierarchy 
+0

些細な階層クエリにストアドプロシージャを使用する理由明確なデメリット! – mathguy

+0

私は彼がストアドプロシージャを作成しようとしていると思っていました。 –

+0

なぜそれを考えましたか? OPがストアドプロシージャソリューションを探していると示唆するために、元の投稿には全く何もありません。 – mathguy

関連する問題