0

私は階層構造を持つテーブルを持っています (n,n_parent,data):

例えば:

  • ディレクトリ 1 (1,0,null)
    • サブディレクトリ 1 (44,1,null)
      • 項目 1 (83,44,a)
      • 項目 2 (98,44,b)
    • サブディレクトリ 2 (46,1,null)
      • 項目 1 (8,46,c)
      • 項目 2 (9,46,d)
  • ディレクトリ 2 (4,0,ヌル)
    • サブディレクトリ 1 (54,4,null)
      • 項目 1 (43,54,e)
      • 項目 2 (48,54,f)
    • サブディレクトリ 2 (101,4,null)
      • アイテム1 (19,101,g)
      • 項目 2 (314,101,h)

ID がある場合、この ID でアイテムを構築します。これは親です。たとえば、ID は 83、98、48、9 です。

SELECT distinct name, n, n_parent FROM portalmdo.zre_filter a START WITH N in (83, 98, 48, 9) CONNECT BY PRIOR N_PARENT = N

Directory 1 (1,0,null)    
Subdirectory 1 (44,1,null)  
Item 1 (83,44,a)  
Item 2 (98,44,b)    
Subdirectory 2 (46,1,null)    
Item 2 (9,46,d)    
Directory 2 (4,0,null)    
Subdirectory 1 (54,4,null)    
Item 2 (48,54,f)

(順序は重要な問題ではありません)

フィールド データが親に送信されるようにします。たとえば、次のようにします。

Directory 1 (1,0,a)    
Subdirectory 1 (44,1,a)  
Item 1 (83,44,a)  
Directory 1 (1,0,b)    
Subdirectory 1 (44,1,b) 
Item 2 (98,44,b)    
Directory 1 (1,0,d)  
Subdirectory 2 (46,1,d)    
Item 2 (9,46,d)    
Directory 2 (4,0,f)    
Subdirectory 1 (54,4,f)    
Item 2 (48,54,f)
4

1 に答える 1

1

CONNECT_BY_ROOT (10g+)を使用できます。

SQL> WITH data AS (
  2     SELECT 'Directory 1' name, 1 n,0 n_p,null dat FROM DUAL
  3     UNION ALL SELECT 'Subdirectory 1', 44,1,null FROM DUAL
  4     UNION ALL SELECT 'Item 1', 83,44,'a' FROM DUAL
  5     UNION ALL SELECT 'Item 2', 98,44,'b' FROM DUAL
  6     UNION ALL SELECT 'Subdirectory 2', 46,1,null FROM DUAL
  7     UNION ALL SELECT 'Item 1', 8,46,'c' FROM DUAL
  8     UNION ALL SELECT 'Item 2', 9,46,'d' FROM DUAL
  9     UNION ALL SELECT 'Directory 2', 4,0,null FROM DUAL
 10     UNION ALL SELECT 'Subdirectory 1', 54,4,null FROM DUAL
 11     UNION ALL SELECT 'Item 1', 43,54,'e' FROM DUAL
 12     UNION ALL SELECT 'Item 2', 48,54,'f' FROM DUAL
 13     UNION ALL SELECT 'Subdirectory 2', 101,4,null FROM DUAL
 14     UNION ALL SELECT 'Item 1', 19,101,'g' FROM DUAL
 15     UNION ALL SELECT 'Item 2', 314,101,'h' FROM DUAL
 16  )
 17  SELECT DISTINCT name, n, n_p, connect_by_root(dat) dat
 18    FROM data a
 19  START WITH N IN (83, 98, 48, 9)
 20  CONNECT BY PRIOR N_P = N;

NAME                    N    N_P DAT
---------------------- -- ------ -------
Item 2                 48     54 f
Item 1                 83     44 a
Item 2                 98     44 b
Subdirectory 1         44      1 b
Subdirectory 1         44      1 a
Item 2                  9     46 d
Directory 1             1      0 b
Subdirectory 2         46      1 d
Directory 1             1      0 d
Directory 2             4      0 f
Subdirectory 1         54      4 f
Directory 1             1      0 a
于 2012-09-20T10:15:50.577 に答える