带有子查询排除的SQL选择字段

时间:2015-03-23 18:03:15

标签: mysql sql subquery notin

问题的标题可能不是最佳的。

我想要实现的是从尚未删除网站的表company_id中检索site。但是,company有多个网站。我不想选择有一个或多个未删除网站的公司。

SELECT DISTINCT(company_id) FROM site WHERE _isDeleted = 1;

给我删除网站的公司(8000多个结果)。

但是当我尝试时:

SELECT DISTINCT(company_id) FROM site WHERE _isDeleted = 1 
AND company_id NOT IN (SELECT company_id FROM site WHERE _isDeleted = 0);

它给了我0结果。为什么?

性能不存在问题,因为它将是一次运行策略查询。

2 个答案:

答案 0 :(得分:1)

我倾向于真的不喜欢习语NOT IN (<subquery>)的大部分用法。对于这个特殊需求,我会考虑这样的查询,而不是:

SELECT company_id
FROM site
GROUP BY company_id
HAVING COUNT(*) != COUNT(NULLIF(_isDeleted, 0))

适用_isDeleted的任何值,NULL实际上等同于0,所有其他值实际上等同于1。我还发现它的含义比原始查询更清晰,如果你关心性能,那么它可能会表现得更好。

答案 1 :(得分:1)

根据您的要求,您需要从未删除网站的表网站中的所有公司,您可以轻松地执行以下操作

select distinct company_id from site where _isdeleted=0 and company_id is not null

要获得没有网站删除的公司,您可以使用

select distinct company_id from site p 
where not exists(select 1 from site x 
                 where x.company_id=p.company_id and x._isdeleted=1)
and p._isdeleted=0

希望它会帮助你