SQL Server如何查询Type=1且无Status=1记录的唯一AccountId
问题原因
你的原查询逻辑方向完全错误:子查询先过滤出了所有Type=1且Status=1的记录,也就是说子查询的结果集里只有存在Status=1记录的AccountId,且每条记录的RowNumber最小值为1。你在外层查询过滤RowNumber is null or RowNumber <=0的条件,在子查询结果集里不可能有匹配项,最终结果自然为空。
解决方案
方案1:使用NOT EXISTS(推荐,性能最优、逻辑直观)
SELECT DISTINCT AccountId, Type, Status FROM TempData1 t1 WHERE t1.Type = 1 AND NOT EXISTS ( SELECT 1 FROM TempData1 t2 WHERE t2.AccountId = t1.AccountId AND t2.Type = 1 AND t2.Status = 1 )
说明:外层查询筛选所有Type=1的记录,子查询校验对应AccountId下是否存在Type=1且Status=1的记录,不存在的记录会被保留,DISTINCT用来保证AccountId唯一。
方案2:使用分组聚合实现
SELECT AccountId, MAX(Type) AS Type, MAX(Status) AS Status FROM TempData1 WHERE Type = 1 GROUP BY AccountId HAVING MAX(CASE WHEN Status = 1 THEN 1 ELSE 0 END) = 0
说明:按AccountId分组,CASE判断分组内是否存在Status=1的记录,存在则返回1,不存在返回0,HAVING过滤掉存在Status=1记录的分组,得到你要的结果。
内容的提问来源于stack exchange,提问作者ariefs
相关产品推荐
相关产品推荐

