如何检查含特定值的行是否存在?查询无指定Key的Task数据
找出所有未包含Key 'A'的Task的SQL解决方案
嘿,这个需求我之前做项目的时候碰到过,给你几个实用的SQL写法,都能搞定这个问题:
方法1:使用NOT EXISTS(推荐,效率较高)
这种方法逻辑直观,而且在taskattributes表的(taskid, key)字段有联合索引的情况下,查询速度会非常快。
SELECT t.taskid FROM task t WHERE NOT EXISTS ( SELECT 1 FROM taskattributes ta WHERE ta.taskid = t.taskid AND ta.key = 'A' );
简单解释:对每一条task记录,检查是否存在对应的taskattributes记录里key等于'A'的条目。如果不存在(NOT EXISTS),就把这个task的ID选出来。
方法2:左连接(LEFT JOIN)筛选NULL值
左连接也是很常用的方式,逻辑是保留所有task记录,再匹配对应属性,没有匹配到'A'属性的记录会显示NULL,我们筛选这些即可。
SELECT t.taskid FROM task t LEFT JOIN taskattributes ta ON t.taskid = ta.taskid AND ta.key = 'A' WHERE ta.taskid IS NULL;
这里要注意:条件ta.key = 'A'是写在ON子句里,而不是WHERE里,这样才能保证左连接保留所有task记录,而不是变成内连接。
方法3:GROUP BY + HAVING统计法
如果后续需要扩展检查多个属性(比如同时不含'A'和'B'),这种方法会更灵活。
SELECT t.taskid FROM task t LEFT JOIN taskattributes ta ON t.taskid = ta.taskid GROUP BY t.taskid HAVING SUM(CASE WHEN ta.key = 'A' THEN 1 ELSE 0 END) = 0;
解释:通过CASE语句统计每个task中key='A'的记录数量,数量为0就说明这个task没有'A'属性。
小提示
如果你的数据量较大,建议给taskattributes表创建(taskid, key)的联合索引,能大幅提升这些查询的执行效率。
内容的提问来源于stack exchange,提问作者user1298426
相关产品推荐
相关产品推荐

