我有两个我认为应该等效的SQL查询:
SELECT COUNT(*) FROM (
SELECT distinct(e.id) FROM entity as e
join organization_feature as o on o.entity_id = e.id
where exists (
select * from entity where o.feature_id = 2086 and o.string_value is not null
) and ( o.feature_id = 2038 ) GROUP BY e.id
) as res
这是第一个,这是第二个:
SELECT COUNT(*) FROM (
SELECT distinct(e.id) FROM entity as e
join organization_feature as o on o.entity_id = e.id
where ( o.feature_id = 2038 )
or (o.feature_id = 2086 and o.string_value is not null)
GROUP BY e.id having count(*)=2
) as res
问题是,第一个给我0作为计数结果,而第二个给我13411.有关我的数据库结构的更多信息或更好地理解查询see here(如果人们想要我重新发布这里的信息,我很高兴)。
任何人都可以解释为什么它们不相同并提供一个"存在的地方"我能用的条款吗?
编辑:谢谢大家的帮助,感谢您的建议我意识到我应该使用:SELECT COUNT(*) FROM (
SELECT distinct(e.id) FROM entity as e
join organization_feature as o on o.entity_id = e.id
where exists (
select * from organization_feature as of where of.feature_id = 2086 and of.string_value is not null and of.entity_id = e.id
) and ( o.feature_id = 2038 ) GROUP BY e.id
) as res
完成我想要做的事情。因为我需要连接的第三个变量来完成我正在尝试的查询,这提供了一个与我尝试的query_2相同的解决方案。再次感谢大家。
答案 0 :(得分:1)
在你提到的另一篇文章中,如果你看一下where exists
子句的答案,你会发现在这个子句中在where where子句中的表之间进行了连接,至少主要联接中的一个表 - 您在第一个查询中没有这样做。
根据您发布的查询,第二个查询应该为您提供您感兴趣的结果。
答案 1 :(得分:1)
where exists (
select * from entity where o.feature_id = 2086 and o.string_value is not null
) and ( o.feature_id = 2038 )
第一个选择的实际上应该是
where exists (
select * from entity where o.feature_id = 2086 and o.string_value is not null
) or ( o.feature_id = 2038 )
因为您不能拥有id = 2086 AND id = 2038
的记录答案 2 :(得分:1)
在第一个查询服务器中首先搜索
SELECT DISTINCT(e.id)
FROM entity AS e
JOIN organization_feature AS o
ON o.entity_id = e.id
WHERE
AND ( o.feature_id = 2038 )
然后为每个创建的记录执行
and EXISTS
(SELECT *
FROM entity
WHERE o.feature_id = 2086
AND o.string_value IS NOT NULL
)
在这种情况下,第一步的每条记录都有值o.feature_id = 2038,第二步总是假的