使用JOIN语句查询驻留在不同数据库中的表的最佳实践

时间:2012-10-22 17:57:12

标签: sql sql-server

您好,非常感谢您的时间。我正在使用SQL Server 2008.我的挑战如下:

我有3个数据库Q_DBCAN_DBUSA_DBCAN_DBUSA_DB具有相同的表格,但代表两个不同的国家

Q_DB有队列表。一个表名为ACCOUNTS,感兴趣的列为ACCOUNTIDSERVER

我想从ACCOUNTS的字段中查询其他两个数据库的信息。一个例子是:

Q_DB.dbo.ACCOUNTS

  • ID123 CAN_DB
  • ID456 USA_DB
  • ID789 CAN_DB

我知道我可以这样做,但我想知道是否有其他方法可以获得结果。

SELECT ACTNAME, AMTDUE, SHIPCOUNTY  
FROM CAN_DB.dbo.Accts 
WHERE ACCTID IN(SELECT ACCOUNTID FROM Q_DB.dbo.ACCOUNTS WHERE SERVER IN('CAN_DB')
UNION ALL
SELECT ACTNAME, AMTDUE, SHIPCOUNTRY 
FROM USA_DB.dbo.Accts
WHERE ACCTID IN(SELECT ACCOUNTID FROM Q_DB.dbo.ACCOUNTS WHERE SERVER IN('USA_DB')

非常感谢任何帮助或意见或建议。感谢

1 个答案:

答案 0 :(得分:3)

我不明白为什么您使用IN一个值(CAN_DB)。

此外,您应该预先EXISTS而不是IN

SELECT ACTNAME, AMTDUE, SHIPCOUNTRY  
FROM CAN_DB.dbo.Accts a1
WHERE EXISTS (SELECT * FROM Q_DB.dbo.ACCOUNTS WHERE ACCTID = a1.ACCTID AND SERVER = 'CAN_DB')
UNION ALL
SELECT ACTNAME, AMTDUE, SHIPCOUNTRY 
FROM USA_DB.dbo.Accts a2
WHERE EXISTS (SELECT * FROM Q_DB.dbo.ACCOUNTS WHERE ACCTID = a2.ACCTID AND SERVER = 'USA_DB')

注意:使用UNION ALL将返回重复项(如果有的话)。要让查询选择唯一的行,请改为使用关键字UNION

编辑:如果您想根据相同的AMTDUEACTNAME对两台服务器中的SHIPCOUNTRY求和:

SELECT  COALESCE(can.ACTNAME,usa.ACTNAME) as ACTNAME,
        COALESCE(can.AMTDUE,0)+COALESCE(usa.AMTDUE,0) as AMTDUE,
        COALESCE(can.SHIPCOUNTRY,usa.SHIPCOUNTRY) as SHIPCOUNTRY  
FROM    CAN_DB.dbo.Accts can
FULL OUTER JOIN USA_DB.dbo.Accts usa
ON      can.ACTNAME = usa.ACTNAME AND 
        can.SHIPCOUNTRY = usa.SHIPCOUNTRY