2011-08-31 90 views
4

我知道有很多這樣的問題,但我的問題不是如何擺脫這個錯誤,而是知道如何在Oracle的第9版中更早地工作。Oracle:列模糊定義

我有一個用Ruby和Oracle DB編寫的舊資源,最近升級到版本= 11。

我無法編輯Oracle數據庫中的數據,只能讀取。所以有兩個表讓我們說:表A(ID,名稱,類型,客戶)和表B(ID,A_ID,類型,人)

所以。有在源代碼中的查詢:

select a.id,b.id from a join b on a.id = b.a_id where type = 'A' 

所以在甲骨文9這個完美工作,但現在我已經得到了「列含糊不清」的錯誤。

我想知道的是:

where type = 'A' 

相同

where a.type = 'A' AND b.type = 'A' 

where a.type = 'A' OR b.type = 'A' 

+3

我真的很驚訝,它在Oracle 9中工作。該查詢應該從來沒有工作。 –

+1

您是否將列TYPE添加到與遷移到Oracle 11相同的進程中的某個表中?或者,也許一個GRANT讓你看到了其中的一列? – Benoit

+0

其實我不能回答這個問題,因爲我不是DBA。所以我只是不知道這個數據庫是如何遷移的( –

回答

5

我認爲這是一個ANSI風格連接的錯誤。使用DBMS_XPLAN來查找舊數據庫中正在過濾哪個表。或者更好的是,從業務邏輯中找出他們應該查詢的內容。

+0

所以。感謝你們所有人的幫助。所以我終於找到了很久以前寫這個查詢的人,他向我解釋了查詢的邏輯。 –

5

否,這就是問題所在:這可能意味着

where a.type = 'A' 

,或者它可能意味着

where b.type = 'A' 

他們有不同的結果;因此錯誤說明它被含糊地定義。

+0

是啊,我知道。但在oracle 9中沒有這樣的錯誤......所以它以某種方式工作並返回結果。所以現在爲了避免這個錯誤,我必須修改查詢,但我不明白這是如何工作的更早。 –

+1

@Andrey:測試Oracle 9中的模糊查詢(您說它起作用)並檢查輸出以查看它使用哪一個:'where a.type ='A''或'where b.type =' A'' –

2

我想你應該在甲骨文9(你說這工作)測試和比較曖昧查詢的輸出:

--- Base 
select a.id,b.id from a join b on a.id = b.a_id where type = 'A' 

同時與非曖昧的:

--- QueryA 
select a.id,b.id from a join b on a.id = b.a_id where a.type = 'A' 

和:

--- QueryB 
select a.id,b.id from a join b on a.id = b.a_id where b.type = 'A' 

像這樣的事:

select a.id,b.id from a join b on a.id = b.a_id where type = 'A' 
MINUS 
select a.id,b.id from a join b on a.id = b.a_id where a.type = 'A' 

(簡稱):

(Base) 
MINUS 
(QueryA) 

然後:

(QueryA) 
MINUS 
(Base) 

如果上述兩種MINUS查詢返回0行,則基本查詢被解釋爲QueryA。

類似地檢查並將Query與BaseB進行比較。


另一個可行的原因的錯誤是在(或約具有相同的時間段)的遷移,是在第二表添加一個type柱。你有舊版本的數據庫表的定義來檢查?

+0

是的,我有。在這兩個表中都有類型列。 –

1

全部 - 請記住,11g優化引擎有一個重大變化。如果您在11g實例上將查詢優化器級別設置爲10.2.x,我敢打賭,查詢將再次開始工作。

這就是說你應該爲它提供別名,所以它對於數據庫服務器或DBA /開發者來說並不是不明確的。 :)