2011-12-21 82 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, 

內部查詢可以返回多個行。我只對第一條記錄感興趣,它必須按table_primary_key排序,因此使用子查詢來允許選擇ROWNUM

當我創建上面在其當前狀態的查詢時,視圖創建成功。當我取消CS.primary_key並刪除硬編碼12345,該視圖創建失敗,沒有爲什麼

(2.1的SQLDeveloper)介紹:「失敗:警告:執行有警告完成」。

而且,只是爲了嘗試和縮小問題,我刪除了ORDER BY,並ROWNUM如下,和同樣的錯誤發生

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

最後,我知道CS.primary_key是一個有效的參考,如我在沒有問題的情況下在我的觀點的其他部分使用。

任何想法,爲什麼引用是有效的,或者如何獲得更詳細的錯誤信息?

編輯:更新開始打開括號

編輯2:感謝迄今的迴應。這裏是問題的總結,我認爲CS.PRIMARY鍵應該在範圍內,因爲我在查詢中的其他地方使用它。下面的代碼工作,但如果我代替硬編碼爲1〜CS.primary_key,它失敗:

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 2011-12-21 11:21:56

+0

什麼是CS.primary_key?它從何而來? – 2011-12-21 11:34:15

+0

你可以顯示整個查詢,這只是一個片段? – MatBailie 2011-12-21 12:02:12

回答

0

從您提供的我建議CS.PRIMARY_KEY超出範圍的子查詢的信息有限。因此,當你使用一個文字時,它會編譯好,並且在它必須解析對CS.PRIMARY_KEY的引用時不編譯。

包括取其表CS是指在子查詢(與培訓相關標準)來檢查這種情況。 如果是,那麼您需要重寫查詢以確保CS表處於其所有依賴項的範圍內。

希望它可以幫助...

請參閱此鏈接的詳細信息:http://etutorials.org/SQL/Mastering+Oracle+SQL/Chapter+5.+Subqueries/5.4+Inline+Views/

你會看到,內嵌視圖的外部查詢之前執行,嵌套參考CS表太深會導致它超出範圍。

更換嵌套子查詢,你做你的排序:

(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 2011-12-21 14:46:58

+0

我認爲CS引用超出了範圍,因爲它超過了嵌套在子查詢中的1個級別。你有沒有試過我在答案中提出的建議,看看是否屬於這種情況? – Ollie 2011-12-21 14:52:01

+0

試着只執行視圖的SELECT部分​​,讓我知道你得到了什麼樣的oracle錯誤信息? – Ollie 2011-12-21 15:03:50