2016-05-12 14 views
0

階層構造のクエリを使用して、テーブル構造から詳細をフェッチしています。私は、条件、が、その投げ不明列エラー START WITHの内側のクエリから列をreferrring階層クエリの内部クエリから列を参照できませんか?

クエリを確認してください午前:

select 
    (select obj.name 
    from (select LEVEL parentLevel, object_id id, name from temp_object START WITH object_id=sopi.OBJECT_ID CONNECT BY PRIOR parent_id = object_id) obj 
      where parentLevel=4) "temp Order Name" 
from 
    (SELECT OBJECT_ID 
    FROM temp_params 
    WHERE value = 'Add' AND object_id IN 
          (SELECT object_id 
          FROM temp_references 
          WHERE reference IN 
            (SELECT object_id 
            FROM temp_params 
            WHERE list_id = 9133409) AND attt_id = '9133410')) sopi 

問題は、私が参照するために計画していますしている、ハイライト領域にあり、内側のクエリの列。 OBJECT_ID = sopi.OBJECT_ID WITH

すなわちSTARTはに動作していない、私はあなたがstart with句にsopiサブクエリを移動し、in条件を使用する必要があることだと思い

答えて

0

を助けてください。

select name 
    from (select level parentlevel, object_id id, name 
      from temp_object 
     start with object_id in 
        (select object_id 
         from temp_params 
         where value = 'Add' 
         and object_id in 
          (select object_id 
           from temp_references 
           where reference in 
            (select object_id 
             from temp_params 
             where list_id = 9133409) 
           and attt_id = '9133410')) 
     connect by prior parent_id = object_id) 
where parentlevel = 4 

SQLFiddle demoサンプルテストデータ:

create table temp_params (object_id number(3), list_id number(8), value varchar2(3)); 
insert into temp_params values (1, 9133409, 'Add'); 
insert into temp_params values (2, 9133411, 'Add'); 
insert into temp_params values (3, 9133412, 'Add'); 

create table temp_references (object_id number(3), reference number(3), attt_id varchar2(8)); 
insert into temp_references values (2, 1, '9133410'); 
insert into temp_references values (3, 1, '9133410'); 

create table temp_object (object_id number(8), parent_id number(8), name varchar2(10)); 
insert into temp_object values (2, 21, 'Object 02'); 
insert into temp_object values (21, 22, 'Object 21'); 
insert into temp_object values (22, 23, 'Object 22'); 
insert into temp_object values (23, 24, 'Object 23'); 
insert into temp_object values (24, 25, 'Object 24'); 
insert into temp_object values (3, 31, 'Object 03'); 
insert into temp_object values (31, 32, 'Object 31'); 
insert into temp_object values (32, 33, 'Object 32'); 
insert into temp_object values (33, 34, 'Object 33'); 

出力:

NAME 
---------- 
Object 23 
Object 33 
+0

@ rohansr002 temp_objectテーブルのレベル4行を持っていないsopiのサブクエリ内のIDがある場合、ポンダーのquerywon'tは、元のクエリと同じように返します - "欠けている"行を取得するには、外部結合を行う必要があります。 temp_objectサブクエリによって返される行が常に存在することが常に保証されている場合、このクエリは正常に動作します – Boneist

2

問題は、あなたから列を参照しようとしているということです孫のサブクエリの祖父母のクエリ。それは、親クエリでいた場合にのみthe documentationごとに、サブクエリの外から列を参照することができます

テーブルからのネストされたサブクエリの参照列は1つのレベルの上の親ステートメントに言及する場合、Oracleは、相関副問合せを行い、サブクエリ。

幸いにも、導入した追加のサブクエリレベルは必要ありません。あなただけ行うことができる必要があります:

select (select  name 
     from  temp_object 
     where  level = 4 
     start with object_id = sopi.object_id 
     connect by prior parent_id = object_id) obj "temp Order Name" 
from (select object_id 
     from temp_params 
     where value = 'Add' 
     and object_id in (select object_id 
          from temp_references 
          where reference in (select object_id 
                from temp_params 
                where list_id = 9133409) 
          and attt_id = '9133410')) sopi 
関連する問題