SQL查询:聚合列与非聚合列对比以排除匹配结果
正确SQL查询写法及思路
核心思路
要实现需求,需先计算表B每个Symbol的Value总和,再筛选出该总和未匹配表A对应Symbol任意Value的Symbol,最后关联表A和表B获取这些Symbol的所有记录。
通用SQL实现
WITH B_Summary AS ( -- 计算表B每个Symbol的Value总和 SELECT Symbol, SUM(Value) AS TotalValue FROM DatabaseB GROUP BY Symbol ), Valid_Symbols AS ( -- 筛选出表B总和未匹配表A对应Symbol任何Value的Symbol SELECT b.Symbol FROM B_Summary b LEFT JOIN DatabaseA a ON b.Symbol = a.Symbol GROUP BY b.Symbol, b.TotalValue HAVING COUNT(CASE WHEN a.Value = b.TotalValue THEN 1 END) = 0 ) -- 关联获取所有有效Symbol的记录 SELECT b.Symbol AS SymbolB, b.Value AS ValueB, a.Symbol AS SymbolA, a.Value AS ValueA FROM DatabaseA a INNER JOIN DatabaseB b ON a.Symbol = b.Symbol INNER JOIN Valid_Symbols vs ON a.Symbol = vs.Symbol ORDER BY a.Symbol, a.Value;
示例数据验证
- Symbol A:表B总和为
750+250=1000,与表A中A的Value(1000)匹配,因此被排除。 - Symbol B:表B总和为
24+1416=1440,与表A中B的Value(1440)匹配,因此被排除。 - Symbol C:表B总和为
1874,与表A中C的Value(1235)不匹配,因此保留所有对应记录,得到你期望的结果表C。
原查询问题分析
你之前的查询错误在于:将表A的Value非聚合字段加入GROUP BY,导致分组逻辑被拆分为表A的每条记录单独分组,无法实现“表B总和与表A对应Symbol所有Value整体对比”的核心逻辑。
内容的提问来源于stack exchange,提问作者HankMorgan
相关产品推荐
相关产品推荐

