UNION ALL查询中AREA2返回与AREA1同数据的问题排查及方案咨询
解决UNION ALL查询中AREA2返回重复数据的问题
首先咱们拆解下你的问题:你用UNION ALL合并AREA1和AREA2服务器的查询结果,但发现AREA2返回了和AREA1完全一样的数据,想知道怎么获取AREA2的真实不同数据,同时疑惑是不是末尾的排序语句导致了重复。
为什么会出现重复数据?
绝对不是排序语句的问题! ORDER BY SERVER, Invoice_Date只是对最终合并后的结果做排序,完全不会导致数据重复。真正的根源是你的两个查询块都指向了同一个本地表dbo.Invoices——你虽然给结果标了AREA1和AREA2的标识,但实际上两个子查询都在查同一份数据,自然输出会重复。
怎么获取AREA2的真实供应商数据?
要访问另一台服务器的表,你需要用四部分名称来指定不同服务器的数据源(前提是两台服务器已经配置好互相访问的权限,比如建立了服务器链接)。举个明确的例子:
- AREA1的表:如果是本地数据库,直接用
dbo.Invoices即可 - AREA2的表:需要写成
[AREA2_Server_Name].[Your_Database_Name].[dbo].[Invoices](把方括号里的占位符换成你实际的服务器名和数据库名)
修正后的完整查询示例
另外注意你原查询里有个小拼写错误:第一个子查询的WHERE条件里写了InvDate,应该是Invoice_Date,我一起帮你修正了:
DECLARE @Invoice_Date SMALLINT; SET @Invoice_Date = 2020; -- 查询AREA1服务器的数据 SELECT DISTINCT 'AREA1' AS 'Server', * FROM ( SELECT Name, Vendor, Invoice_Date, count(*) Count_InvoiceNo, rank() OVER ( PARTITION BY Name ORDER BY count(*) DESC ) rn FROM dbo.Invoices -- 这里是AREA1的目标表 WHERE Invoice_Date >= '2020-01-01' GROUP BY Name, Vendor, Invoice_Date ) t WHERE rn = 1 AND Invoice_Date >= DATEADD(MONTH, - 12, GETDATE()) UNION ALL -- 查询AREA2服务器的数据 SELECT DISTINCT 'AREA2' AS 'Server', * FROM ( SELECT Name, Vendor, Invoice_Date, count(*) Count_InvoiceNo, rank() OVER ( PARTITION BY Name ORDER BY count(*) DESC ) rn FROM [AREA2_Server_Name].[Your_Database_Name].[dbo].[Invoices] -- 这里替换为AREA2的表路径 WHERE Invoice_Date >= '2020-01-01' GROUP BY Name, Vendor, Invoice_Date ) t WHERE rn = 1 AND Invoice_Date >= DATEADD(MONTH, - 12, GETDATE()) ORDER BY Server, Invoice_Date;
额外小提示
如果两台服务器还没配置直接访问的权限,你可能需要先通过sp_addlinkedserver存储过程建立服务器链接,具体步骤可以根据你的SQL Server版本查对应的配置文档,但核心逻辑就是要让你的查询能精准定位到AREA2服务器上的Invoices表。
内容的提问来源于stack exchange,提问作者Sweetcorn
相关产品推荐
相关产品推荐

