使用正确的外部联接来匹配来自两个不同数据库的记录

时间:2010-02-02 19:27:37

标签: sql sql-server sql-server-2005 join

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 个答案:

答案 0 :(得分:2)

看来你必须区分表格。试试:

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

答案 1 :(得分:1)

只需指定别名:

 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

答案 2 :(得分:1)

在JOIN具有相同名称的表时,您需要使用表别名,如果不是自己:

          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 INNOT EXISTS是等效的 - LEFT JOIN / IS NULL效率较低。有关详细信息,请参阅this article