2010-11-02 67 views
1

我有2個數據庫,即db1,db2。我需要一個從這些dbs(db1,db2)中獲取數據的查詢,每個數據庫都有兩張表(讓步,開具發票)。跨多個數據庫連接查詢 - 語法錯誤

在db1.concessions =>讓步是主鍵。 db1.invoicing => [讓步號碼]是主鍵

同樣在db2.concessions =>讓步是主鍵。 db2.invoicing => [特許數]是主鍵

在數據庫1

db1.tbl1 =>特許表具有數據

concession 
    TH-123 
    TH-456 
    FP-789 
    NZ-609 

db1.tbl2 =>發票表具有數據

[Concession Number]   invoiced_on 
    TH-322      10.09.10 
    TH-900      23.10.10 
    FP-675      04.05.09 
    NZ-111      19.11.08 

幸運的是,在數據庫中的特許權的價值在獨特的。 。即讓步[讓步] =發票[特許號碼]產生沒有數據..

在DATABASE2:

db1.tbl1 =>特許表具有數據

concession 
    TH-123 
    FP-789 
    NZ-999 
    TH-900 

db1.tbl2 =>發票表具有數據

[Concession Number]   invoiced_on(dd.mm.yy) 
    TH-456      18.01.06 
    TH-777      23.10.04 
    FP-675      03.05.09 
    NZ-149      26.11.08 

在這裏,在DB2讓步是獨特的,讓步。[讓步] =發票。[特許號碼]的產率沒有數據..

查閱查詢應取具有共同 DB1中的記錄。(concessions.concession OR invoicing.concession數)= DB2(concessions.concession OR invoicing.concession數)

在樣品它應該返回的數據,TH-123,FP-789,NZ-999,FP-675。

我的第二個問題是有可能將此查詢擴展到多個數據庫。我無法將數據庫的數量更改爲1,因爲它們已經修復爲。請讓我知道最好的程序。

我想是這樣的,有語法錯誤,

SELECT a.concession as db1_CON_NUMBER FROM db1.dbo.concessions as a UNION 
SELECT b.[Concession Number] as db1_CON_NUMBER FROM db1.dbo.invoicing as b 
INNER JOIN 
SELECT c.concession as db2_CON_NUMBER FROM db2.dbo.concessions as c UNION 
SELECT d.[Concession Number] as db2_CON_NUMBER FROM db2.dbo.invoicing as d 
ON db1_CON_NUMBER = db2_CON_NUMBER 

希望你會回答這兩個問題。 感謝您耐心閱讀這麼長的郵件!

+1

只是在數據庫名稱前加上db1.dbo.tbl1前綴,然後在查詢中使用它。 – 2010-11-02 10:05:43

+0

感謝您的回覆。我也是這樣做的。即db1.dbo.concessions和db1.dbo.invoicing – satya 2010-11-02 10:07:41

回答

4

如果用戶有權限,可以直接引用其他數據庫。

<database>.<user>.<tablename> 

是數據庫表的完整「路徑」。

經常使用

db1.dbo.tbl1 join db2.dbo.tbl2 

其中DBO被默認數據庫所有者,而不是由一個特定的用戶擁有的任何表由DBO默認擁有。

UPDATE

爲了得到查詢來驗證您可以將其擴展成

SELECT * FROM 
(SELECT a.concession as db1_CON_NUMBER FROM db1.dbo.concessions as a 
UNION 
SELECT b.[Concession Number] as db1_CON_NUMBER FROM db1.dbo.invoicing as b) c 

INNER JOIN 

(SELECT c.concession as db2_CON_NUMBER FROM db2.dbo.concessions as a 
UNION 
SELECT b.[Concession Number] as db2_CON_NUMBER FROM db2.dbo.invoicing as b) d 

ON db1_CON_NUMBER = db2_CON_NUMBER 

但我還沒有來得及檢查是否將返回正確的數據,但你可以測試一下。

+0

我有權訪問所有數據庫。我在查詢中使用了db1.dbo.concessions和db1.dbo.invoicing。希望你能幫我進一步糾正我的查詢。 – satya 2010-11-02 10:09:21

+0

圍繞單獨Union語句的圓括號使得它們可以加入的派生表,但是您需要周圍的select a才能從連接中獲取任何數據。 – 2010-11-02 10:23:21

+0

你比我快幾秒:-)謝謝你的回覆。還有一個問題是,我可以擴展這個查詢多個數據庫(我的意思是超過2)。或者我需要考慮一些額外的措施... – satya 2010-11-02 10:26:51

2

如果數據庫在同一個SQL Server實例可以使用3部分命名:

database_name.schema_name.object_name 

Using Identifiers As Object Names

如果數據庫不在同一個實例,創建鏈接的服務器:Linked Servers

Creating Linked Servers (SQL Server Database Engine)

鏈接的服務器允許訪問針對OLE DB數據源的分佈式異構查詢 。在創建了一個 鏈接的服務器之後,可以針對此 服務器運行分佈式的 查詢,並且查詢可以從多個數據源中連接表 。如果將 鏈接的服務器定義爲SQL Server的 實例,則可以執行遠程存儲的 過程。

+3

嗯。如果數據庫在同一個sql實例上,則不需要鏈接服務器。 – 2010-11-02 10:05:01

+0

我真的應該更準確地閱讀這些問題。謝謝。 – 2010-11-02 10:06:26

0
select * from(
SELECT a.concession as db1_CON_NUMBER FROM BABMwork6_5_3108.dbo.concessions as a 
     WHERE (a.manuell_archive_delete! = 'Delete' OR a.manuell_archive_delete IS NULL) 
UNION SELECT b.[Concession Number] as db1_CON_NUMBER FROM BABMwork6_5_3108.dbo.invoicing as b) as tbl1 
INNER JOIN 
(SELECT c.concession as db2_CON_NUMBER FROM BABMwork6_6_2909.dbo.concessions as c 
     WHERE (c.manuell_archive_delete! = 'Delete' OR c.manuell_archive_delete IS NULL) 
UNION SELECT d.[Concession Number] as db2_CON_NUMBER FROM BABMwork6_6_2909.dbo.invoicing as d) as tbl2 
ON tbl1.[db1_CON_NUMBER] = tbl2.[db2_CON_NUMBER]