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;
あなたのビューを生成するために実行しているすべてのコードを投稿することができますなど、どこにすべきではないSQLステートメントとコンマに括弧の数がありますか?これは参照の範囲などを決定するのに役立ちます – Ollie
CS.primary_keyは何ですか?それはどこから来たのですか? –
これはフラグメントだけであるクエリ全体を表示できますか? – MatBailie