您好,非常感谢您的时间。我正在使用SQL Server 2008.我的挑战如下:
我有3个数据库Q_DB
,CAN_DB
,USA_DB
。 CAN_DB
和USA_DB
具有相同的表格,但代表两个不同的国家
Q_DB
有队列表。一个表名为ACCOUNTS
,感兴趣的列为ACCOUNTID
和SERVER
我想从ACCOUNTS
的字段中查询其他两个数据库的信息。一个例子是:
Q_DB.dbo.ACCOUNTS
我知道我可以这样做,但我想知道是否有其他方法可以获得结果。
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')
非常感谢任何帮助或意见或建议。感谢
答案 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
。
编辑:如果您想根据相同的AMTDUE
和ACTNAME
对两台服务器中的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