2009-06-11 64 views
10

我在Oracle中有兩種不同的模式(比如S1,S2)和兩個模式中的表(比如S1.Table1,S2.Table2)。我想從模式S1查詢這兩個表。查詢來自不同模式的兩個表

S1和S2都在不同的數據庫中。從DB1 - 架構S1,我想要做這樣的事情,

select T1.Id 
    from S1.Table1 T1 
    , S2.Table2 T2 
Where T1.Id = T2.refId 

我知道這樣做會創建一個數據庫鏈接,第二模式和在查詢中使用它的方法之一。可悲的是,我沒有創建數據庫鏈接所需的權限。沒有數據庫鏈接有沒有辦法做到這一點?例如,在TOAD中,您可以比較兩個模式對象。但是,再次,兩個模式對象,這是一般比較。

任何想法,建議,非常感謝。提前致謝。

+0

訪問您的DBA獲取privs! – tuinstoel 2009-06-11 12:59:45

+0

好的建議。看起來,只有拜訪他並獲得特權似乎是可行的。 – Guru 2009-06-11 13:57:22

回答

8

DB鏈接幾乎是這裏的遊戲名稱。如果你無法自己創建一個,那麼檢查是否有任何可以使用的公共數據庫鏈接。

您的數據庫管理員也可能願意讓其中一個DB鏈接用於在S1實例上創建S2.Table2的物化視圖。

另一個選擇可能是網絡服務,但我的猜測是你會遇到更多的管理問題,而不是簡單的數據庫鏈接。只有在沒有任何鏈接的充分理由時才考慮這些(例如:兩個不想在數據庫之間打開防火牆漏洞的獨立組織)。

如果失敗了,那麼你進入了一個非常難看的領域,但是你可能能夠做出一些工作。例如:

  • 打開一個工具,它可以一次從多個連接讀取並在那裏進行連接。訪問。蟾蜍的數據分析,無論如何。
  • 使用工具,如蟾蜍S2.Table2複製到自己的模式(「創建另一個模式」,其次是「複製數據到另一個模式」)
  • 如果你有,或可以得到互補目錄對象定義上兩個服務器,都可以在S2中創建一個S2的物化視圖作爲外部表,並從S1讀取。

不過,你真的不想長期維持這些解決方案。

15

如果兩個模式位於同一數據庫中,則不需要數據庫鏈接。

如果S1已被授予S2.table2上的SELECT特權(來自dba帳戶或來自S2架構:GRANT SELECT ON S2.Table2 TO S1),則您的查詢應該從架構S1工作。

+0

謝謝,我知道。這些模式位於不同的數據庫中。 – Guru 2009-06-11 12:00:06

+0

這是正確的答案! – 2016-11-16 15:59:07

1

使用CREATE DATABASE LINK語句創建數據庫鏈接。數據庫鏈接是一個數據庫中的模式對象,使您可以訪問另一個數據庫上的對象。

一點題外話,但您可能需要使用較新的聯接語法:

SELECT 
    T1.Id 
    FROM S1.Table1   T1 
     INNER JOIN S2.Table2 T2 ON T1.Id = T2.refId 

所有連接條件出現在「ON」的條款,並過濾條件出現在「WHERE」。

這種新風格使得左/右連接更容易閱讀和理解。另外,我對Oracle並不熟悉(自從我開始工作多年以來),但對於SQL Server,當使用視圖的查詢中將舊連接樣式和新連接樣式混合在一起時,我看到了一些問題。

+0

感謝KM。但令人遺憾的是,我沒有創建數據庫鏈接的好處,並且可能無法獲得DBA幫助。 認爲應該有一些辦法。 :( – Guru 2009-06-11 13:19:12

+0

dba怎麼沒有幫助,他們應該在那裏幫助你的項目工作? – 2009-06-11 17:31:34

1

您可以創建一個java存儲過程,該過程連接到另一個數據庫,並通過JDBC在另一個數據庫上執行選擇。 java存儲過程必須返回一個集合。您可以通過select from table(...)將該表與您自己的數據庫中的表加入。

請參閱here以獲得大致類似的解決方案。

我認爲這種方法會很慢並且很複雜,因爲你必須做很多的編碼,你必須爲你的java存儲過程創建一個pl/sql包裝器。

最好創建一個數據庫鏈接。

1

您不指定是否需要此功能作爲生產代碼的一部分,或者如果您試圖連接兩個表以執行一次性分析。如果是後者,可以使用Microsoft Access創建一個包含到兩個數據庫的鏈接表的本地mdb文件,然後編寫引用這兩個表的本地Access查詢。然後,您可以使用該mdb作爲各種報告工具的數據源。

查詢可能不會像本機Oracle數據庫鏈接那樣有效地使用索引,但它總比沒有好。

編輯:沒關係 - 我看到這已經在上面建議了。

相關問題