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

Sql 使用JOIN语句查询驻留在不同数据库中的表的最佳实践,sql,sql-server,Sql,Sql Server,您好,非常感谢您抽出时间。我正在使用SQLServer2008。我的挑战如下: 我有3个数据库Q_DB,CAN_DB,USA_DBDB和USA\U DB是否可以有相同的表格,但代表两个不同的国家 Q_DB有队列表。一个表称为ACCOUNTS,感兴趣的列是ACCOUNTID和SERVER 我想从账户字段中查询其他两个数据库的信息。例如: Q_DB.dbo.账户 ID123 CAN\U DB ID456美国 ID789 CAN_DB 我知道我可以这样做,但我想知道是否有其他方法可以获得结果 SE

您好,非常感谢您抽出时间。我正在使用SQLServer2008。我的挑战如下:

我有3个数据库
Q_DB
CAN_DB
USA_DB
DB
USA\U DB
是否可以有相同的表格,但代表两个不同的国家

Q_DB
有队列表。一个表称为
ACCOUNTS
,感兴趣的列是
ACCOUNTID
SERVER

我想从
账户
字段中查询其他两个数据库的信息。例如:

Q_DB.dbo.账户

  • ID123 CAN\U DB
  • ID456美国
  • 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')

任何帮助、意见或建议都将不胜感激。谢谢

我不明白您为什么在中使用带有单个值(
CAN_DB
)的

此外,您应该预先认知
存在
而不是
中的

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

编辑:如果要根据相同的
ACTNAME
SHIPCOUNTRY
对两台服务器的
AMTDUE
求和:

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

所以你说你想合并两个不同查询的结果,你想知道是否有比使用联合更好的方法?我不确定您期望的是什么。没有SQL Server 2010—有2000、2005、2008、2008 R2和2012版—但没有2010版。。。。那么你真正使用的是哪一种呢?我想看看使用WHERE with the UNION是不是最聪明的方法,或者使用另一种方法,我可以去掉UNION(因为我基本上是在重写代码),谢谢你的时间紧迫感2008@jnoel10事实上,有两个不同的表格,在2个不同的数据库中。你需要把他们联合起来。他们认为你这样做很好。然而,我会质疑具体在哪里。您是否希望USA_DB拥有与USA_DB以外的服务器连接的ACCTID?谢谢您的回复,我同意EXISTS看起来比IN好得多。我想看看是否有一种方法可以称之为完全不用工会。我之所以使用UNION ALL,是因为我可能会有重复的ACCTID,但从不同的服务器重复的
ACCTID
是否相互关联?如果是这样,可以使用
连接
。。。我想您可能想根据相同的
ACCTID
SHIPCOUNTRY
对两台服务器的
AMTDUE
求和?遗憾的是,它们可能没有关联(这是一个数据完整性问题,我也将解决,但进展缓慢),这就是为什么我没有使用JOIN,但我是SQL的新手,仍在学习:)好的,我知道
ACCTID
不一样,但是
ACTNAME
会一样吗?至于
EXISTS
而不是
中的
,使用
EXISTS
更有效<
中的code>将选择表中的每一行,然后将返回的ID与
存在的ID进行比较
将在返回满足条件的一行后立即停止选择。