1

Oracleで再帰結合を行う最良の方法は何ですか? 次のようなスキーマがあるとします。

node:
  id: number
  parent_id: number
  name: string

子ノードをすべての親ノードに参加させるにはどうすればよいですか?

次のことを試しましたが、失敗します。

SELECT c.* from node LEFT JOIN(
  SELECT * FROM node c
  START WITH id = c.id
  CONNECT BY PRIOR id = parent_id
) ON 1 = 1

START WITH id = c.id 部分について不平を言っています。

4

4 に答える 4

1

質問で提供した情報に基づいて、実際に何を達成しようとしているのかを判断するのは非常に難しいですが、それぞれのサブツリーを表示したいようですID(ID = 1から始まるメインツリー、それらを注文しましょう)次に、ID = 2から始まるサブツリーなど)。

次に例を示します。

with Tb_Table (id, parent_id, name) as(
  select 1, 1, 'Child_1' from dual union all
  select 2, 1, 'Child_2' from dual union all
  select 3, 3, 'Child_3' from dual
),
rec_data (id, parent_id, name, lv) as(
  select id
       , parent_id
       , name
       , 0 lv
   from  Tb_Table  
  where id = id

  union all

  select tt.id
       , tt.parent_id
       , tt.name 
       , lv + 1
   from rec_data rt
   join tb_table tt
     on (rt.id = tt.parent_id)   
)
search depth first by id set ord
cycle id set is_cycle to 'Y' default 'N'
select id
     , parent_id
     , concat(lpad(' ', lv*3,' '), name) name
  from rec_data

結果:

Id Parent_Id   Name 
-----------------------   
1     1        Child_1 
1     1          Child_1 
2     1          Child_2 
2     1        Child_2 
3     3        Child_3 
3     3          Child_3 

デモ

于 2012-09-29T19:08:42.537 に答える
1

基本的に、開始する場所の開始点が必要なので、持っていない id が 1 つありparent_id、そのnullid 1 を説明するためにここで行ったことには、parent_id がありません。

create table node (id number,parent_id number,name varchar2(200));

insert into node values(1,null,'king');
insert into node values(2,1,'gaurav');
insert into node values(3,1,'rohan');
insert into node values(4,2,'anshoo');
insert into node values(5,4,'ajay');

 select id,parent_id,name from node 
 start with parent_id is null 
 connect by prior id= parent_id;

sqlfiddle リンク

于 2012-09-28T21:19:54.553 に答える
0

cは結合のどこかにあり、括弧の外側には到達できませんが、 の使用方法を段階的に学習する必要があると思いますconnect by。正直なところ、このリンクは私がそれを学び、理解するのに役立ちました: http://www.adp-gmbh.ch/ora/sql/connect_by.html

于 2012-09-28T21:18:51.990 に答える
-4

SQL Server(使用しているように見えます)では、再帰クエリがサポートされています。以下の私の例では、ユーザーが多くの場所に割り当てられています。これらの各場所には、親の場所を含めることができます。このクエリは、@userIDが割り当てられているすべての場所と子の場所を返します。

    ALTER FUNCTION [dbo].[tvf_UserLocations_Recursive] 
(   
    @UserID uniqueidentifier
)
RETURNS TABLE 
AS
RETURN 
(
    WITH recusrive (LocationID)
    AS (
        --anchor
        SELECT LocationID
        FROM LocationUser lu
        WHERE lu.Aspnet_Userid = @userID
        UNION ALL
        -- Recursive member definition
        SELECT child.LocationID         
        FROM recusrive parent
            INNER JOIN Location child ON (parent.LocationID = child.LocationParentID)
    )
    SELECT *
    FROM recusrive
)
于 2012-09-28T20:55:30.847 に答える