Sql 使用JOIN语句查询驻留在不同数据库中的表的最佳实践
您好,非常感谢您抽出时间。我正在使用SQLServer2008。我的挑战如下: 我有3个数据库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
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进行比较
将在返回满足条件的一行后立即停止选择。