You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何查询app_log表中无app_status_id=3的app_id与app_name

解决方法

原查询的问题

你的SQL存在两个核心错误:

  1. 子查询未关联主表:NOT EXISTS里的子查询是全局检查整个app_log表是否存在app_status_id=2的记录,而非针对当前行的app_id做针对性检查。由于app_log中确实存在app_status_id=2的记录,这个条件永远为假,导致返回空结果。
  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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 21:35:36