2013-11-20 3 views
1

У меня есть большая проблема с объединением двух баз данных MSSQL вместе (на том же сервере) с использованием LEFT JOIN. Я запустить этот SQL из базы данных OLAB_DB и получаю ошибку:Ошибка при объединении двух баз данных (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' положение) в вашем первом statement: '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... 

ИЛИ

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

Смежные вопросы