如何查询app_log表中无app_status_id=3的app_id与app_name
解决方法
原查询的问题
你的SQL存在两个核心错误:
- 子查询未关联主表:
NOT EXISTS里的子查询是全局检查整个app_log表是否存在app_status_id=2的记录,而非针对当前行的app_id做针对性检查。由于app_log中确实存在app_status_id=2的记录,这个条件永远为假,导致返回空结果。 - 不必要的笛卡尔积:主查询同时引用
app和app_log却未设置连接条件,会生成两张表的笛卡尔积,既冗余又需要额外用DISTINCT去重,完全没必要。
正确的查询写法
方法1:使用NOT EXISTS(推荐,性能更优)
SELECT app.app_id, app.app_name FROM app WHERE NOT EXISTS ( SELECT 1 FROM app_log WHERE app_log.app_id = app.app_id AND app_log.app_status_id = 3 )
该查询会逐个校验app表中的每个应用,判断其对应的app_log记录里是否存在app_status_id=3的条目,不存在则保留该应用。
方法2:使用LEFT JOIN + IS NULL
SELECT app.app_id, app.app_name FROM app LEFT JOIN app_log ON app.app_id = app_log.app_id AND app_log.app_status_id = 3 WHERE app_log.app_id IS NULL
通过左连接将app表与app_log中app_status_id=3的记录关联,未匹配到的应用(即无status=3日志)对应的app_log字段会为NULL,过滤这些记录即可得到目标结果。
方法3:使用GROUP BY + HAVING
SELECT app.app_id, app.app_name FROM app JOIN app_log ON app.app_id = app_log.app_id GROUP BY app.app_id, app.app_name HAVING SUM(CASE WHEN app_log.app_status_id = 3 THEN 1 ELSE 0 END) = 0
按应用分组后,统计每个应用的app_status_id=3记录数,当统计数为0时,说明该应用没有对应的日志记录。
以上三种写法都能得到你期望的结果:
app_id app_name 1234 aaa 9374 ccc
内容的提问来源于stack exchange,提问作者Aya chan
相关产品推荐
相关产品推荐

