初学者 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
    )
);

Sample SQL Fiddle

我的想法是:

  1. 获取 Bobbys 提供的啤酒
  2. 与那些啤酒的饮酒者一起,找出哪些饮酒者喜欢 Bobbys 的啤酒
  3. 统计每位饮酒者喜欢的啤酒数量(仅限 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);