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

SQL selecting field with subquery exclusion

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

我想要实现的是从 table site 中检索 company_id,其中站点尚未被删除。但是,company 有多个站点。我不想 select 一家拥有一个或多个 non-deleted 网站的公司。

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 个结果。为什么?

那里的性能没有问题,因为它将是 运行 一次政策查询。

我真的不喜欢这个成语的大多数用法 NOT IN (<subquery>)。对于这种特殊需求,我会考虑这样的查询:

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

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

根据您的要求,您需要table站点中所有未删除该站点的公司,您可以轻松地进行以下操作

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

希望对您有所帮助