Использование правого внешнего соединения для сопоставления записей из двух разных баз данных - PullRequest
1 голос
/ 02 февраля 2010

SQL 2005:

Я пытаюсь создать внешнее соединение, которое будет извлекать записи из двух разных баз данных. Моя цель состоит в том, чтобы определить, какие записи в базе данных B не имеют совпадающих записей в базе данных A. Когда я попытался выполнить запрос, он вернул ошибку ниже. Я не уверен, как обойти эту ошибку:

'Таблицы или функции' AssetCompType_EquipmentProperty_LinkTable 'и' TA-Reporting.dbo.AssetCompType_EquipmentProperty_LinkTable 'имеют одинаковые открытые имена. Используйте имена корреляций, чтобы различать их. '

          select * 
            from AssetCompType_EquipmentProperty_LinkTable
right outer join [database A].dbo.AssetCompType_EquipmentProperty_LinkTable on
[database A].dbo.AssetCompType_EquipmentProperty_LinkTable.AssetCompTypeID=
[database B].dbo.AssetCompType_EquipmentProperty_LinkTable.AssetCompTypeID

Ответы [ 3 ]

2 голосов
/ 02 февраля 2010

Похоже, вы должны различать таблицы. Попробуйте с:

select * 
from AssetCompType_EquipmentProperty_LinkTable T1
  right outer join 
    [database A].dbo.AssetCompType_EquipmentProperty_LinkTable T2 
       on T1.AssetCompTypeID = T2.AssetCompTypeID
1 голос
/ 02 февраля 2010

Вам нужно использовать псевдонимы таблиц при объединении таблиц с одинаковыми именами, если не они сами:

          SELECT a.*, b.*
            FROM AssetCompType_EquipmentProperty_LinkTable a
RIGHT OUTER JOIN [database A].dbo.AssetCompType_EquipmentProperty_LinkTable b ON a.AssetCompTypeID = b.AssetCompTypeID

Это необходимо только для синтаксиса JOIN, но также потому, что вы не можете использовать SELECT * из-за вероятности одинаковых столбцов в таблицах.

Тем не менее, чтобы получить желаемый результат, вы должны рассмотреть:

Использование NOT IN


SELECT b.*
  FROM [database A].dbo.AssetCompType_EquipmentProperty_LinkTable b
 WHERE b.AssetCompTypeID NOT IN (SELECT a.AssetCompTypeID
                                   FROM AssetCompType_EquipmentProperty_LinkTable a)

Использование NOT EXISTS


SELECT b.*
  FROM [database A].dbo.AssetCompType_EquipmentProperty_LinkTable b
 WHERE NOT EXISTS (SELECT NULL
                     FROM AssetCompType_EquipmentProperty_LinkTable a
                    WHERE a.AssetCompTypeID = b.AssetCompTypeID) 

Использование LEFT JOIN/IS NULL


   SELECT b.*
     FROM [database A].dbo.AssetCompType_EquipmentProperty_LinkTable b
LEFT JOIN AssetCompType_EquipmentProperty_LinkTable a ON a.AssetCompTypeID = b.AssetCompTypeID
    WHERE a.AssetCompTypeID IS NULL

Заключение


Из трех вариантов NOT IN и NOT EXISTS эквивалентны - LEFT JOIN / IS NULL менее эффективен. Подробнее см. в этой статье .

1 голос
/ 02 февраля 2010

Просто назначьте псевдонимы:

 select * 
            from AssetCompType_EquipmentProperty_LinkTable tbl_thisDB
right outer join [database A].dbo.AssetCompType_EquipmentProperty_LinkTable tbl_A on
tbl_A.AssetCompTypeID=
tbl_thisDB.AssetCompTypeID
...