3
Table1:

Child     Parent       a

Bob        Chris       2
Chris      Kate        1
Shane      Lana        3
Nala       Bob         4


Table2:

b           Talent      

1           'something'
2           'nothing'
3           'something'
4           'nothing'

SELECT  Child
FROM Table1
INNER JOIN Table2 ON (Table1.a =  Table2.b)
WHERE Table2.Talent = 'something'
connect by prior  Table1.Child =  Table1.Parent

このコードは、親の行を返します

クリス

「Where」句が含まれていない場合、コードは次を返します。

Bob
Chris
Kate

Chris
Kate

Shane
Lana

etc

私が返したいのは、列ではなく行の次のものです。

ボブ・クリス

Chris は才能があり、Bob の親であるため、コードは親だけでなく、その親のクエリを作成した子も返します。このコードでは、次のようになります。

SELECT  Child
FROM Table1
INNER JOIN Table2 ON (Table1.a =  Table2.b)
WHERE Table2.Talent = 'something'
connect by prior  Table1.Child =  Table1.Parent

才能のある子供のクリスと、クリスの検索を開始した前の子供のボブがいるでしょう。たとえば、ボブがガラの子供で、ガラがクリスの子供だったとしても、ボブとクリスだけを結果として取得したいと思います。 .

条件:一時テーブルまたは任意の種類のテーブルを作成する権限がないため、一時テーブルなしでそれを行う方法がわからない場合を除き、ループを使用してこれを行うことはできません

「前の」ステートメントの前の子と、実際には前の子の親である新しい「子」を返す方法がわかりません。

4

2 に答える 2

2

必要なのは、connect_by_root演算子を使用することだけです。

クエリの目標についてはわかりませんが (たとえば、親が才能がない場合に才能のある祖父を返すか返さないかなど)、その演算子の使用法は次のようになります。

select 
  originated_from_child, 
  found_ancestor, 
  is_ancestor_talented
from (
  select 
    CONNECT_BY_ROOT relations.child  originated_from_child,
    relations.parent                 found_ancestor,
    ( 
      select count(1) 
      from table2 
      where 
        b = a 
        and 
        talent = 'something' 
        and 
        rownum = 1
    )                                is_ancestor_talented
  from 
    table1 relations
  start with 
    relations.a in (
      select talents.b 
      from table2 talents 
      where talents.talent = 'something')
  connect by 
    prior relations.child = relations.parent
)
where 
  originated_from_child <> found_ancestor
  and
  is_ancestor_talented = 1

SQLFiddle の例

于 2013-08-26T17:13:41.860 に答える
1

「HR」データベースを使用してテストできます

SELECT last_name "Employee", CONNECT_BY_ROOT last_name "Manager",
   LEVEL-1 "Pathlen", SYS_CONNECT_BY_PATH(last_name, '/') "Path"
   FROM employees
   WHERE LEVEL > 1 and department_id = 110
   CONNECT BY PRIOR employee_id = manager_id;

Employee        Manager         Pathlen Path   
--------------- ------------ ---------- ----------------------------   
Higgins         Kochhar               1 /Kochhar/Higgins   
Gietz           Kochhar               2 /Kochhar/Higgins/Gietz   
Gietz           Higgins               1 /Higgins/Gietz   
Higgins         King                  2 /King/Kochhar/Higgins   
Gietz           King                  3 /King/Kochhar/Higgins/Gietz  
于 2013-12-06T03:36:29.210 に答える