如何统计无记录ID的项目数量?SQL查询求助
解决方法:找出无记录ID的项目
你的原查询存在几个关键问题:
- 使用**内连接(JOIN)会自动过滤掉没有关联
FIELD记录的项目,需要换成左连接(LEFT JOIN)**才能保留所有项目 - 字段名
PROJECT-HAS-RECORD包含横杠,SQL会将其解析为减法运算,必须用对应数据库的标识符包裹:MySQL用反引号,SQL Server用方括号[],PostgreSQL用双引号"` COUNT(DISTINCT PROJECT.PROJECTID)无实际意义,因为已经按PROJECTID分组,每个分组的ID本身就是唯一的
方案1:统计每个项目的无记录字段数(含无关联字段的项目)
如果需要得到每个项目中PROJECT-HAS-RECORD≠1的字段数量,同时包含没有关联任何字段的项目(这类项目计数为0),可以使用以下查询:
MySQL 写法
SELECT p.PROJECTID, COUNT(f.PROJECTID) AS no_record_count FROM PROJECT p LEFT JOIN FIELD f ON p.PROJECTID = f.PROJECTID AND f.`PROJECT-HAS-RECORD` != 1 GROUP BY p.PROJECTID;
SQL Server 写法
SELECT p.PROJECTID, COUNT(f.PROJECTID) AS no_record_count FROM PROJECT p LEFT JOIN FIELD f ON p.PROJECTID = f.PROJECTID AND f.[PROJECT-HAS-RECORD] != 1 GROUP BY p.PROJECTID;
PostgreSQL 写法
SELECT p.PROJECTID, COUNT(f.PROJECTID) AS no_record_count FROM PROJECT p LEFT JOIN FIELD f ON p.PROJECTID = f.PROJECTID AND f."PROJECT-HAS-RECORD" != 1 GROUP BY p.PROJECTID;
方案2:仅筛选完全无有效记录的项目
如果你的核心需求是找出所有关联字段都无记录,或根本没有关联任何字段的项目,下面的查询更高效直接:
MySQL 写法
SELECT p.PROJECTID FROM PROJECT p WHERE NOT EXISTS ( SELECT 1 FROM FIELD f WHERE f.PROJECTID = p.PROJECTID AND f.`PROJECT-HAS-RECORD` = 1 );
SQL Server 写法
SELECT p.PROJECTID FROM PROJECT p WHERE NOT EXISTS ( SELECT 1 FROM FIELD f WHERE f.PROJECTID = p.PROJECTID AND f.[PROJECT-HAS-RECORD] = 1 );
PostgreSQL 写法
SELECT p.PROJECTID FROM PROJECT p WHERE NOT EXISTS ( SELECT 1 FROM FIELD f WHERE f.PROJECTID = p.PROJECTID AND f."PROJECT-HAS-RECORD" = 1 );
这个查询直接检查每个项目是否不存在PROJECT-HAS-RECORD=1的关联字段,完全匹配你“找出所有没有记录ID的项目”的需求。
内容的提问来源于stack exchange,提问作者New Coder
相关产品推荐
相关产品推荐

