初学者 SQL 查询逻辑
Beginner SQL Query Logic
我有 2 个表:一个名为 likes,其中列有饮酒者和他们喜欢的啤酒。另一个名为 sells 的栏目包含酒吧名称和他们出售的啤酒。
我在处理特定查询时遇到困难:
"Drinkers who like every beer served by Bobbys"
我已经完成了以下(有缺陷的)SQL 查询:
Select distinct a.drinker
from likes a
where exists
(
select *
from likes b, sells t
where a.drinker = b.drinker
and a.beer = t.beer
and t.bar = 'Bobbys'
);
但是这个查询 returns 喜欢 Bobbys 提供的一些啤酒的饮酒者,而不是所有的啤酒。只要一个饮酒者喜欢 Bobbys 提供的啤酒,它的名字就会被返回,这不是声明所要求的。
我很难从逻辑上更改此查询以仅包括那些喜欢酒吧 Bobbys 提供的所有啤酒的饮酒者,而不仅仅是一些。
如有任何帮助,我们将不胜感激。谢谢。
这种类型的查询有时称为 关系划分 对此的常见解决方案是使用双重否定并询问 饮酒者不存在 Bobbys 提供的任何不属于他们喜欢的啤酒。
遵循起来可能有点棘手,但逻辑是合理的。请注意,它会包括可能也喜欢其他啤酒的饮酒者,只要他们喜欢 Bobbys 提供的一切。
select distinct drinker
from likes l1
where not exists (
select *
from sells s
where bar = 'Bobbys'
and not exists (
select *
from likes l2
where s.beer = l2.beer
and l2.drinker = l1.drinker
)
);
我的想法是:
- 获取 Bobbys 提供的啤酒
- 与那些啤酒的饮酒者一起,找出哪些饮酒者喜欢 Bobbys 的啤酒
- 统计每位饮酒者喜欢的啤酒数量(仅限 Bobbys 提供的啤酒),以及 return 计数等于 Bobbys 提供的啤酒总数的饮酒者。
这里有一个查询:
with bobbysbeers as (select distinct beer from sells where bar = 'Bobbys')
select a.drinker
from likes a, bobbysbeers b
where a.beer = b.beer
group by drinker
having count(distinct a.beer) = (select count(*) from b);
我有 2 个表:一个名为 likes,其中列有饮酒者和他们喜欢的啤酒。另一个名为 sells 的栏目包含酒吧名称和他们出售的啤酒。
我在处理特定查询时遇到困难:
"Drinkers who like every beer served by Bobbys"
我已经完成了以下(有缺陷的)SQL 查询:
Select distinct a.drinker
from likes a
where exists
(
select *
from likes b, sells t
where a.drinker = b.drinker
and a.beer = t.beer
and t.bar = 'Bobbys'
);
但是这个查询 returns 喜欢 Bobbys 提供的一些啤酒的饮酒者,而不是所有的啤酒。只要一个饮酒者喜欢 Bobbys 提供的啤酒,它的名字就会被返回,这不是声明所要求的。
我很难从逻辑上更改此查询以仅包括那些喜欢酒吧 Bobbys 提供的所有啤酒的饮酒者,而不仅仅是一些。
如有任何帮助,我们将不胜感激。谢谢。
这种类型的查询有时称为 关系划分 对此的常见解决方案是使用双重否定并询问 饮酒者不存在 Bobbys 提供的任何不属于他们喜欢的啤酒。
遵循起来可能有点棘手,但逻辑是合理的。请注意,它会包括可能也喜欢其他啤酒的饮酒者,只要他们喜欢 Bobbys 提供的一切。
select distinct drinker
from likes l1
where not exists (
select *
from sells s
where bar = 'Bobbys'
and not exists (
select *
from likes l2
where s.beer = l2.beer
and l2.drinker = l1.drinker
)
);
我的想法是:
- 获取 Bobbys 提供的啤酒
- 与那些啤酒的饮酒者一起,找出哪些饮酒者喜欢 Bobbys 的啤酒
- 统计每位饮酒者喜欢的啤酒数量(仅限 Bobbys 提供的啤酒),以及 return 计数等于 Bobbys 提供的啤酒总数的饮酒者。
这里有一个查询:
with bobbysbeers as (select distinct beer from sells where bar = 'Bobbys')
select a.drinker
from likes a, bobbysbeers b
where a.beer = b.beer
group by drinker
having count(distinct a.beer) = (select count(*) from b);