SQL Server双表查询需求:获取指定条件的所有账户及余额(含无交易记录账户)
SQL Server双表查询需求:获取指定条件的所有账户及余额(含无交易记录账户)
我来帮你搞定这个查询问题~你当前代码的核心问题是WHERE子句里的T.Post = 1把没有交易记录的账户给过滤掉了。因为用LEFT JOIN的时候,没有匹配交易记录的账户,Transaction表的所有字段都会是NULL,而NULL和1做相等判断是不成立的,所以这些账户就被排除了。
问题分析
你的原始SQL里,WHERE A.AccSubCode = 3 AND T.Post = 1这行,相当于把LEFT JOIN变成了INNER JOIN——只有同时满足AccSubCode=3且存在Post=1的交易记录的账户才会被保留,这就不符合你要显示所有AccSubCode=3账户的需求。
修正后的SQL代码
把T.Post = 1的条件从WHERE子句移到LEFT JOIN的ON子句里,这样就能只关联符合Post=1的交易记录,同时保留所有AccSubCode=3的账户:
SELECT A.AccName, A.AccID, ISNULL(SUM(T.Debt), 0) - ISNULL(SUM(T.Credit), 0) AS [Balance] FROM Accounts AS A LEFT JOIN [Transaction] AS T ON A.AccID = T.AccID AND T.Post = 1 -- 把Post条件放在JOIN关联规则里,而非WHERE过滤 WHERE A.AccSubCode = 3 GROUP BY A.AccID, A.AccName
代码说明
- 条件位置调整:将
T.Post = 1放到ON子句,确保左连接时只匹配符合条件的交易,没有匹配的账户依然会被保留,只是Transaction相关字段为NULL。 - NULL值处理:用
ISNULL(SUM(T.Debt), 0)和ISNULL(SUM(T.Credit), 0),保证当账户没有符合条件的交易时,SUM的结果(NULL)会被转换成0,最终余额计算为0-0=0。 - 简化AccID获取:因为已经按
A.AccID分组,直接使用A.AccID即可,不需要用Max(ISNULL(A.AccID, 0)),多余且没必要。
执行这段SQL后,就能得到你想要的结果:
| AccName | AccID | Balance |
|---|---|---|
| Account1 | 1 | 500 |
| Account2 | 2 | 0 |
备注:内容来源于stack exchange,提问作者Ahmed Saif
相关产品推荐
相关产品推荐

