SQLite中NOT IN子查询返回2列预期1列的问题咨询
解决SQLite中NOT IN子查询多列报错的问题
嘿,这个报错的原因其实很直白——你给NOT IN的子查询返回了两列(third_party_id和effeciency_rating),但NOT IN只能接受单列值来和主查询的third_party_id做匹配,这就触发了sub-select returns 2 columns - expected 1的错误。
修正方案1:精简子查询返回列
直接把子查询里的返回列改成只保留需要匹配的third_party_id就行,这样就能满足NOT IN的要求:
SELECT * FROM Studio WHERE third_party_id NOT IN ( SELECT third_party_id -- 仅返回需要匹配的单列 FROM Staff WHERE Staff.third_party_id = Studio.third_party_id AND Staff.effeciency_rating < 0.7 );
更推荐的方案:用NOT EXISTS替代NOT IN
虽然上面的代码能解决问题,但我更推荐用NOT EXISTS来实现同样的逻辑,原因有两个:
NOT EXISTS不需要关心子查询返回什么列(通常写SELECT 1就行),逻辑更清晰;- 避免
NOT IN处理NULL值时的坑:如果子查询的third_party_id存在NULL,NOT IN会直接返回空结果,而NOT EXISTS的行为更符合预期。
对应的代码如下:
SELECT s.* FROM Studio s WHERE NOT EXISTS ( SELECT 1 -- 这里返回任意列都不影响结果 FROM Staff st WHERE st.third_party_id = s.third_party_id AND st.effeciency_rating < 0.7 );
这个查询的逻辑是:找出所有没有雇佣效率评分低于0.7的员工的工作室,和你原本的需求完全一致,同时更健壮。
内容的提问来源于stack exchange,提问作者Hendrik
相关产品推荐
相关产品推荐

