不使用相交运算符重写SQL查询

时间:2015-09-12 21:37:08

标签: mysql sql querying

我想查询这句话:

Bars that are frequented by both Mike and John

[表常常由2列组成:饮酒者和他们去的酒吧]

我最初想过使用这个SQL查询,使用交叉运算符:

SELECT  bar
FROM frequents
WHERE drinker ='Mike'
INTERSECT
SELECT bar
FROM frequents
WHERE drinker ='John'

但MySQL不支持使用Intersect运算符。我可能使用了Join运算符,但是我很难重写这个查询。

2 个答案:

答案 0 :(得分:3)

这是你想要的inner join

SELECT a.bar
FROM frequents a
JOIN frequents b ON a.bar = b.bar 
WHERE a.drinker = 'Mike'
  AND b.drinker = 'John';

请注意,intersect会比较选择列表中的所有列,因此等效连接需要执行相同操作。在你的情况下,它只是一列。

intersect运算符并不真正直接转换为inner join,但intersect会返回比较集合所共有的行,而联接会在给定条件下过滤并生成由连接集中的行组成的新行集。 <{1}}值的处理方式也存在差异(和重复)。

另一种选择是将null谓词与相关子查询一起使用:

exists

SELECT a.bar FROM frequents a WHERE a.drinker ='Mike' AND EXISTS ( SELECT 1 FROM frequents b WHERE a.bar = b.bar AND b.drinker ='John' ); 谓词:

in

还有很多其他方法可以做到这一点,但我想我会停在这里:)

答案 1 :(得分:0)

一种简单的方法是使用聚合:

select f.bar
from frequents f
group by f.bar
having max(drinker = 'John') > 0 and
       max(drinker = 'Mike) > 0;

或者:

select f.bar
from frequents f
where f.drinker in ('John', 'Mike')
group by f.bar
having count(*) = 2;

我喜欢having条款,因为我发现它适用于各种各样的条件,例如John和Mike,但不是Sara。或约翰,迈克,萨拉和阿比盖尔三人。