2011-05-09 107 views
11

我在一個sql服務器上有兩個數據庫,我必須將兩個表從一個數據庫服務器鏈接到另一個數據庫服務器中的兩個表以獲取我需要的信息。問題是,當我嘗試鏈接來自第二個數據庫服務器的兩個表時,查詢將返回1000或更多的重複項。我如何在兩個數據庫上運行單個查詢?所有表格都有repair_ord列。有人可以幫幫我嗎?謝謝。多個數據庫上的SQL查詢

server 1 = CXADMIN SERVER 2 = SAADMIN

這裏是我的查詢看起來像至今:

SELECT RF.REPAIR_ORD, 
     RH.RECV_UNIT, 
     RH.RECV_SERIAL_NBR, 
     RP.FAULT_CODE, 
     RP.REPAIR_ACTION_CODE, 
     CG.TASK_CODE 
    FROM CXADMIN.RO_FAILURE_DTL RF, 
     CXADMIN.RO_HIST RH, 
     [email protected] rp, 
     [email protected] cg 
WHERE RF.REPAIR_ORD = RH.REPAIR_ORD 
    AND RP.REPAIR_ORD = CG.REPAIR_ORD 
    AND RF.FAILURE_CODE ='DISK' 
    AND RH.CURR_FACILITY_ID ='23' 
    AND RF.CREATED_DATE >'1-JUN-2010' 
    AND RF.CREATED_DATE < '1-JUL-2010' 
    AND ( CG.TASK_CODE ='PHMD' 
     OR CG.TASK_CODE ='PHSN' 
     OR CG.TASK_CODE ='CHMD' 
     OR CG.TASK_CODE ='CHSN') 
+1

爲什麼你不只是'聯盟所有'他們呢? – zerkms 2011-05-09 01:43:44

+1

使用JOIN時(您的查詢使用ANSI-89 JOIN語法)會出現重複項,因爲父記錄具有多個子記錄。我們不知道您的數據 - 註釋掉表格,並逐漸添加它們以知道哪些連接負責。 – 2011-05-09 01:51:41

+0

@zerkms,我試過聯合功能,但我很困惑如何使用它在這個查詢B/C所有表相同。他們只有repair_ord列相同。 – Justin 2011-05-09 02:28:27

回答

8

我想重複的問題不是連接兩個數據庫之一,而是在你的加入擺在首位。我想你可能需要一個INNER或OUTER連接來處理鏈接。至於從兩個不同的數據庫獲取數據,語法非常簡單。您只需添加服務器名稱點數據庫名稱點所有者名稱點表名稱。

例如:

SELECT firstdb.*, seconddb.* 
FROM Server1.Database1.dbo.myTable AS firstdb 
INNER JOIN Server2.Database2.dbo.myTable AS seconddb 
    ON firstdb.id = seconddb.id 

在你的榜樣,這聽起來像你所得到的鏈接工作,但你對repair_ord領域的加盟問題。雖然我不知道你的模式,但我猜想這個鏈接應該是一個INNER JOIN。如果您只是在FROM語句中添加這兩個表,並且您沒有正確執行WHERE語句,則會像您所描述的那樣陷入麻煩。

我建議你簡化這個設置並把它放在一個測試環境中(在一個數據庫上)。嘗試四表連接,直到你做對了。然後添加多數據庫調用的複雜性。

+0

對此有何建議? http://dba.stackexchange.com/questions/102170/selecting-rows-from-same-name-table-from-multiple-database-in-single-result-set – xameeramir 2015-05-21 16:10:48

1

如果你改寫了FROM子句中使用ANSI 92,你會得到這個

FROM CXADMIN.RO_FAILURE_DTL RF 
    INNER JOIN CXADMIN.RO_HIST RH 
     ON RF.REPAIR_ORD = RH.REPAIR_ORD 
      , 
     [email protected] rp 
     INNER JOIN [email protected] cg 
     ON RP.REPAIR_ORD = CG.REPAIR_ORD 

然後,它變得容易看到你創建RF join RHRP JOIN CG

你需要之間的笛卡爾積JOIN RF到RP或CG,或RH至RP或CG

例如

FROM CXADMIN.RO_FAILURE_DTL RF 
    INNER JOIN CXADMIN.RO_HIST RH 
     ON RF.REPAIR_ORD = RH.REPAIR_ORD 
     INNER JOIN [email protected] rp 
     ON RF.REPAIR_ORD = RP.REPAIR_ORD 
     INNER JOIN [email protected] cg 
     ON RP.REPAIR_ORD = CG.REPAIR_ORD 

或者如果您堅持使用ANSI-86樣式的連接,您可以將AND RF.REPAIR_ORD = RP.REPAIR_ORD添加到您的Where子句中