在不同服務器上的兩個不同數據庫中有兩個表,我需要將它們連接起來才能進行少量查詢。我有什麼選擇?我該怎麼辦?通過在不同服務器上的兩個數據庫中連接兩個表來查詢數據
回答
您需要使用sp_addlinkedserver
來創建服務器鏈接。請參閱reference documentation的使用說明。一旦建立了服務器鏈接,就可以像平常一樣構建查詢,只需將數據庫名稱添加到其他服務器的前綴即可。即:
-- FROM DB1
SELECT *
FROM [MyDatabaseOnDB1].[dbo].[MyTable] tab1
INNER JOIN [DB2].[MyDatabaseOnDB2].[dbo].[MyOtherTable] tab2
ON tab1.ID = tab2.ID
一旦建立鏈接,你也可以使用OPENQUERY
到遠程服務器上執行SQL語句,只將數據傳送回給你。這可以更快一點,並且它可以讓遠程服務器優化您的查詢。如果您在上述示例中將數據緩存在DB1
的臨時(或內存中)表中,那麼您將能夠查詢它,就像加入標準表一樣。例如:
-- Fetch data from the other database server
SELECT *
INTO #myTempTable
FROM OPENQUERY([DB2], 'SELECT * FROM [MyDatabaseOnDB2].[dbo].[MyOtherTable]')
-- Now I can join my temp table to see the data
SELECT * FROM [MyDatabaseOnDB1].[dbo].[MyTable] tab1
INNER JOIN #myTempTable tab2 ON tab1.ID = tab2.ID
查看documentation for OPENQUERY查看更多示例。上面的例子很有意思。在此具體示例中,我肯定會使用第一種方法,但如果使用查詢過濾掉某些數據,則使用OPENQUERY
的第二個選項可以節省一些時間和性能。
如果您的dba不允許鏈接的服務器,則可以使用OPENROWSET。聯機叢書將提供您需要的語法。
兩個表的連接最好由DBMS完成,所以應該這樣做。您可以在其中一個數據庫上鏡像較小的表或其子集,然後加入它們。有人可能會試圖在ETL服務器上這樣做,比如informatica,但如果表格很大,我認爲它不可取。
從實際的企業角度來看,最好的做法是在數據庫中創建數據庫表的鏡像副本,然後只需要一個任務/ proc用delta每小時更新一次。
試試這個:
SELECT tab2.column_name
FROM [DB1.mdf].[dbo].[table_name_1] tab1 INNER JOIN [DB2.mdf].[dbo].[table_name_2] tab2
ON tab1.col_name = tab2.col_name
我想下面這段代碼和它的正常工作
SELECT TimeTrackEmployee.StaffID
FROM dbo.tblGBSTimeCard AS GBSTimeCard INNER JOIN
TimeTrak.dbo.tblEmployee AS TimeTrackEmployee ON GBSTimeCard.[Employee Number] = TimeTrackEmployee.GBSStaffID
如果數據庫鏈接選項不可用,你可以採取另一種途徑是通過鏈接表ODBC到MS Access或Crystal報告等,並在那裏進行連接。
你可以嘗試以下方法:
select customer1.Id,customer1.Name,customer1.city,CustAdd.phone,CustAdd.Country
from customer1
inner join [EBST08].[Test].[dbo].[customerAddress] CustAdd
on customer1.Id=CustAdd.CustId
也許硬編碼的數據庫名稱不是一個SQL查詢中始終是最好的辦法。因此,添加同義詞將是更好的方法。並非所有數據庫在多個分段環境中都具有相同的名稱。它們可能由PROD,UAT,SIT,QA等後綴組成。因此,請注意硬編碼查詢並使其更具動態性。方法#1:使用同義詞在同一臺服務器上的數據庫之間鏈接表。
方法2:從每個數據庫中分別收集數據並將其加入您的代碼中。您的數據庫連接字符串可以通過數據庫或配置文件成爲應用服務器配置的一部分。
這個只要按照以下查詢
select a.Id,a.type,b.Name,b.City from DatabaseName.dbo.TableName a left join DatabaseName.dbo.TableName b on a.Id=b.Id
我在哪裏寫的數據庫名稱,你必須定義的數據庫的名稱。如果你在同一個數據庫中,所以你不需要定義數據庫名稱,但是如果你在其他數據庫中,你必須提及數據庫名稱作爲路徑,否則它會顯示錯誤。 希望我讓你的工作變得簡單
- 1. 查詢兩個服務器上的兩個數據庫未連接
- 2. 查詢來自不同數據庫中兩個表的數據
- 3. 執行一個查詢,連接來自同一個MySQL服務器的不同數據庫的兩個表
- 4. 通過REST在兩個不同服務器上的兩個數據庫之間接收數據
- 5. SSIS - 來自兩個數據庫在不同服務器上的OleDB源查詢
- 6. 從不同服務器上的兩個不同數據庫中加入查詢
- 7. 如何將兩個不同的mysql數據庫中的兩個表連接到同一臺服務器上?
- 8. 查詢來自不同服務器的不同數據庫中兩個表的數據?
- 9. 在同一臺服務器上從兩個不同數據庫中加入兩個數據庫表
- 10. 使用位於不同服務器上的兩個數據庫中的兩個表的寫入查詢
- 11. 如何連接來自不同數據庫的兩個表格
- 12. ZEND FW:連接來自不同數據庫的兩個表
- 13. 需要SQL查詢才能在兩個不同的數據庫中連接表
- 14. 如何連接來自兩個不同數據庫的兩個表?
- 15. 使用ADODB連接將兩個不同服務器上的兩個不同數據庫中的兩個表與vba左連接
- 16. 同步來自兩個不同PostgreSQL數據庫的兩個表
- 17. 在同一臺服務器上查詢兩個mysql數據庫的性能?
- 18. 如何在兩個不同的數據庫中連接兩個表?
- 19. MySQL:跨多個位於不同服務器上的數據庫連接查詢
- 20. 需要SQL查詢來連接不同數據庫中的兩個表,但數據庫位於不同服務器中
- 21. 連接兩個數據庫
- 22. 如何合併兩個不同服務器上的兩個數據庫?
- 23. JDBC在同一臺服務器上跨兩個MySQL數據庫連接?
- 24. 如何在兩臺不同的機器上連接兩個mysql數據庫?
- 25. 在一個laravel中連接兩個不同的數據庫5.5
- 26. tsql - 將不同數據庫中的兩個表連接到不同的服務器上
- 27. Mysql的加盟條件在同一服務器中連接兩個數據庫
- 28. 查詢兩個數據庫
- 29. linq查詢來自兩個數據庫
- 30. 如何同步不同服務器的兩個數據庫?
是否可以使用php-mysql ..如果是的話你能否給我一個建議,我該如何使用這個選項增長? – Jhanvi 2012-09-26 08:47:26
我不知道MySQL是否支持鏈接服務器。這個答案是特定於Microsoft SQL服務器的。 – 2012-10-04 18:40:59
如果有人正在尋找一個PostgreSQL的答案,試試這個:http://www.postgresql.org/docs/9.4/static/postgres-fdw.html – PJSCopeland 2015-01-19 22:27:48