2013-11-20 50 views
1

使用LEFT JOIN將兩個MSSQL數據庫連接在一起(在同一臺服務器上)時遇到了很大問題。我跑從數據庫OLAB_DB這個SQL並且得到錯誤:加入兩個數據庫時出錯(SQL Server)

The multi-part identifier "OLAP_DB.dbo.OLAP_invoice.UserID" could not be bound. 

似乎有與數據庫不能夠發現自己的問題,我不知道該怎樣來解決這個想法。我有雙重和三重檢查拼寫和改寫了SQL幾次,但現在我只是不得不放棄尋求幫助:(

這不起作用:

SELECT TOP 200 
    COALESCE(LTRIM(RTRIM(contact_db.dbo.ContactTable.EmailAdr)),LTRIM(RTRIM(contact_db.dbo.CustomerTable.EmailAdr))) AS EMAIL, 
    OLAP_invoice.OrdreLinjeID AS ORDERNO 
    OLAP_invoice.SalgsPris AS PRICE, 
    OLAP_invoice.UserID AS CONTACTID 
FROM OLAP_invoice,contact_db.dbo.CustomerTable 
    LEFT JOIN contact_db.dbo.ContactTable 
    ON OLAP_DB.dbo.OLAP_invoice.UserID = contact_db.dbo.ContactTable.UserID 
WHERE contact_db.dbo.CustomerTable.ClientID = OLAP_invoice.ClientID 

但跳過左連接和剛剛從兩個不同的數據庫中獲取數據只是罰款

這只是正常:

SELECT TOP 200 
    LTRIM(RTRIM(contact_db.dbo.CustomerTable.EmailAdr)) AS EMAIL, 
    LTRIM(RTRIM(contact_db.dbo.ContactTable.UserID)) AS EMAIL2, 
    OLAP_invoice.OrdreLinjeID AS ORDERNO 
    OLAP_invoice.SalgsPris AS PRICE, 
    OLAP_invoice.UserID AS CONTACTID 
FROM OLAP_invoice,contact_db.dbo.CustomerTable 
WHERE contact_db.dbo.CustomerTable.ClientID = OLAP_invoice.ClientID 
AND contact_db.dbo.ContactTable.UserID = OLAP_invoice.UserID 

我需要LEFT JOIN的原因是,有些訂單沒有使用UserID(僅限ClientID)進行註冊。 我已經檢查了訪問權限,並且單獨訪問這些字段沒有問題,當我必須比較LEFT JOIN中的值並指定絕對路徑時,會出現問題。

你有什麼想法可能是錯的?

+1

你混合明確連接(使用'JOIN'關鍵字)和隱式連接(在'WHERE'條款)在你第一次聲明:'FROM OLAP_invoice,contact_db.dbo.CustomerTable'你不應該那樣做。 –

+0

您不僅應該永不混合使用顯式和隱式連接(通常可能會得到不正確的重試或錯誤),但您絕對不應該使用隱式連接,它們是SQL反模式。 – HLGEM

回答

1

你可以試試這個:

SELECT TOP 200 COALESCE(LTRIM(RTRIM(contact_db.dbo.ContactTable.EmailAdr)),LTRIM(RTRIM(contact_db.dbo.CustomerTable.EmailAdr))) AS EMAIL, 
     OLAP_invoice.OrdreLinjeID AS ORDERNO 
     OLAP_invoice.SalgsPris AS PRICE, 
     OLAP_invoice.UserID AS CONTACTID 
FROM OLAP_invoice LEFT JOIN contact_db.dbo.ContactTable ON OLAP_DB.dbo.OLAP_invoice.UserID = contact_db.dbo.ContactTable.UserID, contact_db.dbo.CustomerTable 
WHERE contact_db.dbo.CustomerTable.ClientID = OLAP_invoice.ClientID 
+0

這確實奏效!多麼尷尬!當然,我必須首先指定OLAP_invoice,因爲這是我要加入的表格。花了四分鐘的時間解決了我花了幾個小時的時間 - 這就是爲什麼我熱愛社區支持!謝謝! – willstedt

1

您從OLAP_invoice選擇,但加入到OLAP_DB.dbo.OLAP_invoice。每次需要對錶格進行限定,或使用別名。 因此,要麼:

FROM OLAP_DB.dbo.OLAP_invoice 
left join contact_db.dbo.ContactTable 
on OLAP_DB.dbo.OLAP_invoice... 

OR

FROM ROM OLAP_invoice 
LEFT JOIN ontact_db.dbo.ContactTable 
ON OLAP_invoice... 

或者你可以使用別名爲好,少打字的方式。

FROM OLAP_invoice OI 
LEFT JOIN ontact_db.dbo.ContactTable CT 
ON OI... 
1

就我個人而言,我儘量避免在我的FROM中有多個表格,而不是有意指定連接的類型。

,我覺得這樣的事情要多得多的可讀性和可維護性:

SELECT TOP 200 
    COALESCE(LTRIM(RTRIM(con.EmailAdr)), LTRIM(RTRIM(cus.EmailAdr))) AS EMAIL, 
    i.OrdreLinjeID AS ORDERNO 
    i.SalgsPris AS PRICE, 
    i.UserID AS CONTACTID 

FROM OLAP_invoice i 
    LEFT JOIN contact_db.dbo.CustomerTable cus ON cus.ClientID = i.ClientID 
    LEFT JOIN contact_db.dbo.ContactTable con ON con.UserID = i.UserID 
+1

我同意 - 雖然我的別名有一些問題。我打算現在清理它,當它工作。 – willstedt

相關問題