2011-12-21 8 views
1

Oracleビューを作成するときに、次のステートメントがあります。この文は、特定の値をMYVALUEカラムとして返すことです。Oracleビューのサブクエリがテーブル作成時に失敗する

(SELECT myval 
    FROM (SELECT myval 
      FROM mytable 
     WHERE primary_key = /*CS.primary_key*/ 12345 
     ORDER BY table_primary_key ASC) 
WHERE ROWNUM < 2) AS MYVALUE, 

複数の行を返すことができます。私は第1のレコードにのみ関心があり、table_primary_keyで注文する必要があります。したがって、ROWNUMの選択を可能にするためにサブクエリを使用します。

上記の現在の状態でクエリを作成すると、ビューが正常に作成されます。 「失敗しました:警告:警告で完了し、実行」私はCS.primary_keyのコメントを解除し、ハードコードさ12345を削除すると、ビューの作成はなぜ

(のsqldeveloper 2.1)の記述がないと、失敗します。

はまた、ちょうど試してみて、問題を絞り込むために、私はORDER BYを除去し、ROWNUM以下のように、と同じエラーが

(SELECT myval 
    FROM (SELECT myval 
      FROM mytable 
     WHERE primary_key = CS.primary_key) 
) AS MYVALUE, 

最後に、私はCS.primary_keyが有効な参照である知っている、などが発生しました私は問題なしで私のビューの他の部分で使用します。

参照が有効な理由、または詳細なエラーメッセージの入手方法については、

編集:更新された始動口ブラケット

EDIT2:これまでに回答していただきありがとうございます。ここでは問題の要約ですが、CS.PRIMARYキーはスコープ内にあるはずです。クエリの他の場所で使用するためです。以下のコードは動作しますが、私はCS.primary_keyにハードコードさ1を交換した場合、それは失敗します。

drop view myview; 
drop table mytable; 
drop table mytable_parent; 
drop table proof_table; 

-- ISSUE TABLES 
create table mytable_parent (primary_key number primary key); 
create table mytable (primary_key number, myval varchar(255), parent_primary_key number); 
insert into mytable_parent values (1); 
insert into mytable_parent values (2); 
insert into mytable values (1, 'myval1-1', 1); 
insert into mytable values (2, 'myval1-2', 1); 
insert into mytable values (3, 'myval2-1', 2); 

-- EXAMPLE TABLE TO PROVE CS.* WORKS 
create table proof_table (primary_key number primary key, parent_primary_key number, any_old_value varchar(255)); 
insert into proof_table values (1, 1, 'proofval1-1'); 
insert into proof_table values (2, 2, 'proofval1-2'); 

-- VIEW 
CREATE OR REPLACE FORCE VIEW myview AS 
    SELECT 

    -- PROOF STATEMENT USING CS.primary_key SUCCESSFULLY 
    (SELECT any_old_value FROM proof_table WHERE parent_primary_key IN 
    (SELECT primary_key FROM proof_table WHERE parent_primary_key = 

    -- USING CS REFERENCE, NO PROBLEM 
    CS.primary_key) 

) AS PROOF_VALUE, 

    -- PROBLEM STATEMENT 
    (SELECT myval FROM (SELECT myval FROM mytable 
     WHERE parent_primary_key = /*CS.primary_key*/ 1 
     ORDER BY primary_key ASC) 
    WHERE ROWNUM < 2) AS MYVALUE 

    -- DEFINE CS 
    FROM mytable_parent CS; 
+1

あなたのビューを生成するために実行しているすべてのコードを投稿することができますなど、どこにすべきではないSQLステートメントとコンマに括弧の数がありますか?これは参照の範囲などを決定するのに役立ちます – Ollie

+0

CS.primary_keyは何ですか?それはどこから来たのですか? –

+0

これはフラグメントだけであるクエリ全体を表示できますか? – MatBailie

答えて

0

あなたは私がCS.PRIMARY_KEYがあなたのサブクエリの範囲外であることをお勧めしたい供給している限られた情報から。したがって、リテラルを使用するとOKがコンパイルされ、CS.PRIMARY_KEYへの参照を解決する必要がある場合はコンパイルされません。

サブクエリ(関連基準付き)でCSが参照しているテーブルを含めて、これが該当するかどうかを確認します。 この場合、CSテーブルがそのすべての依存関係の有効範囲に含まれていることを確認するために、クエリを書き直す必要があります。あなたはそのインライン・ビューは、外部クエリの前に実行され、あまりにも深くCSテーブルを参照します入れ子に表示されますhttp://etutorials.org/SQL/Mastering+Oracle+SQL/Chapter+5.+Subqueries/5.4+Inline+Views/

は、このリンクで詳細を参照してください...それがお役に立てば幸いそれが範囲外になる原因となります。

あなたが発注を行い、ネストされたサブクエリ置き換え:分析関数や、あなたの行を制限する他の方法で

(SELECT myval 
    FROM (SELECT myval 
      FROM mytable 
      WHERE parent_primary_key = CS.primary_key 
      ORDER BY primary_key ASC) 
    WHERE ROWNUM < 2) AS MYVALUE 

をし、それはこれがテストされ

罰金を動作しますが、と上記のコードを交換します:

(SELECT DISTINCT 
     FIRST_VALUE(myval) OVER (PARTITION BY parent_primary_key ORDER BY primary_key) 
    FROM mytable 
    WHERE parent_primary_key = CS.primary_key) AS MYVALUE 

はあなたが望むものに近いかもしれないし、CSへの参照がスコープ内にあります。

+0

返事をありがとう。私はCSリファレンスが範囲内にあると思っています。私のコメントを参照してください "EDIT2" – xchagger

+0

私はあなたのサブクエリにネストされた1レベル以上のCS参照が範囲外だと思います。私の答えで提案したことを試してみましたか? – Ollie

+0

ビューのSELECT部分​​だけを実行し、取得したOracleエラーメッセージを教えてください。 – Ollie

関連する問題