gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 05:11:29 26 4
gpt4 key购买 nike

您好,非常感谢您抽出宝贵的时间。我正在使用 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')

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

最佳答案

我不明白为什么您将 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

编辑:如果您想根据相同的 ACTNAMESHIPCOUNTRY 对两个服务器的 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 - 使用 JOIN 语句查询驻留在不同数据库中的表的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13016996/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com