多表使用UNION ALL时如何去除空行
解决UNION ALL合并多表时的空行问题
我来帮你搞定这个合并后出现空行的问题~从你的SQL代码来看,空行大概率来自两个地方:要么是子查询里混入了MNO为空的无效记录,要么是分组后某些会员在指定日期范围内没有任何余额、采购或扣款记录,导致三个数值字段全为0。咱们可以从这两个角度优化:
优化思路1:从源头过滤无效记录
在每个子查询的WHERE条件里加上非空判断,把没有会员编号的记录直接排除,避免它们进入合并环节。
优化思路2:过滤分组后全0的行
分组完成后,用HAVING条件只保留至少有一个数值字段不为0的行,剔除那些没有任何业务数据的“空行”。
下面是修改后的完整SQL代码:
declare @FromDate date='2018-05-01'; declare @ToDate date='2018-05-10'; select ROW_NUMBER() OVER(ORDER BY (SELECT 1)) AS [SNO], t.MNO, MNAME , isnull(sum(v1),0.00) as Balance, isnull(sum(v2),0.00) as CurrentPurchase, isnull(sum(v3),0.00) as Deduction from ( -- 过滤tblProductPurchaseBalance中MNO为空的记录 select MNO, PendingDeduc as v1, NULL as v2, NULL as v3 from tblProductPurchaseBalance where EntryDate between @FromDate and @ToDate AND MNO IS NOT NULL union all -- 过滤tblMnoProductPurchase中MNO为空的记录 select MNO, NULL as v1, TotalAmount, NULL as v3 from tblMnoProductPurchase where PurchaseDate between @FromDate and @ToDate AND MNO IS NOT NULL union all -- 过滤tblDeduction中MemNo为空的记录 select MemNo as MNO, NULL as v1, NULL as v2, AAVIN from tblDeduction where EntryDate between @FromDate and @ToDate AND MemNo IS NOT NULL ) t inner join TBLMEMBERS on t.MNO=TBLMEMBERS.MNO group by t.MNO,MNAME -- 只保留至少有一个数值字段不为0的行 having isnull(sum(v1),0.00) <> 0 OR isnull(sum(v2),0.00) <> 0 OR isnull(sum(v3),0.00) <> 0 order by t.MNO
方案说明
- 子查询过滤:每个子查询都加上了会员编号的非空判断,从源头杜绝无效空记录进入合并结果,减少后续处理的冗余。
- 分组后过滤:
HAVING条件会检查分组后的三个数值字段,只要其中一个不为0就保留该行,完美剔除那些没有任何业务数据的“空行”,和你需要的结果一致。
如果你的空行是其他特殊情况(比如个别字段为NULL),可以根据实际需求调整HAVING里的条件,但这个方案应该能解决你描述的核心问题~
内容的提问来源于stack exchange,提问作者Nandha
相关产品推荐
相关产品推荐

