gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 11:56:05 24 4
gpt4 key购买 nike

我要查询这条语句:

Bars that are frequented by both Mike and John

[餐 table 常客由两列组成:饮酒者和他们去的酒吧]

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

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

但 MySQL 不支持使用相交运算符。我虽然可能会使用 Join 运算符,但我很难重写此查询。

最佳答案

这是您想要的内部联接:

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

请注意,交集会比较选择列表中的所有列,因此等效连接也需要这样做。不过,在您的情况下,它只是一列。

intersect 运算符并没有真正直接转换为 inner join,尽管 intersect 返回的行对于所比较的集合是公共(public)的,而连接根据给定条件进行过滤并生成一组新行,这些行由连接集中的行组成。 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 谓词:

SELECT bar
FROM frequents
WHERE drinker ='Mike'
AND bar IN (SELECT bar FROM frequents WHERE drinker ='John')

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

关于mysql - 不使用相交运算符重写 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32543987/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com