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
希望对您有所帮助
问题的标题可能不是最佳的。
我想要实现的是从 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
希望对您有所帮助