有两个表,一个叫drinkers,有一列名字,另一个叫frequents,有两列,drinker和bars(他们经常去的)。
我有一个问题可以回答这个问题:
Drinkers who frequent all bars
或者换个说法:
Drinkers such that there aren’t any bars that they don’t frequent
下面是生成的查询:
SELECT d.name
FROM drinkers d
WHERE NOT EXISTS (
SELECT b.name
FROM bars b
WHERE NOT EXISTS (
SELECT *
FROM frequents f
WHERE f.drinker = d.name
AND f.bar = b.name
)
)
当使用两个NOT EXISTS
时,我最难理解逻辑。我如何理解这些类型的查询?
2条答案
按热度按时间ycl3bljg1#
您可以尝试从内到外展开这类查询。因此,从最后一个子查询开始:
在这里,您选择具有特定名称的特定酒吧的客户端:换句话说,你是在检查这个特定的饮酒者是否去过这个酒吧。2那么现在:
可以被看作是
在这里,您选择了所有没有这个人作为客户的酒吧。因此,您最终会得到类似于
我想在这一点上,这个问题应该很清楚了:选择所有的饮酒者,没有他们就没有酒吧。
r1zk6ea12#
我不知道您是否一定需要执行这些 NOT EXISTS 循环,因为您完全可以执行类似的操作
基本上,先计算酒吧的总数,然后将每个人经常光顾的酒吧数与该总数进行比较,在COUNT中添加这些 distinct 子句可以忽略重复项。