有 2 个表,一个称为 drinkers,有一列名称,另一个称为 frequents,有 2 个列,drinker 和 bar(他们经常光顾)。
我有一个查询可以回答这个陈述:
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
时,我很难遵循逻辑。
我如何理解这些类型的查询?
最佳答案
您可以尝试从内到外展开这些类型的查询。所以,从最后一个子查询开始:
SELECT *
FROM frequents f
WHERE f.drinker = d.name
AND f.bar = b.name
在这里,您要选择具有特定名称的特定酒吧的客户:换句话说,您要检查这个特定的饮酒者是否去这个酒吧。所以现在:
SELECT b.name
FROM bars b
WHERE NOT EXISTS (
SELECT *
FROM frequents f
WHERE f.drinker = d.name
AND f.bar = b.name
)
可以看作是这样的
SELECT b.name
FROM bars b
WHERE NOT EXISTS (this particular client in it)
在这里,您要选择没有此人作为客户的所有酒吧。因此,你最终会得到类似的东西
SELECT d.name
FROM drinkers d
WHERE NOT EXISTS (any bar without this guy as a client)
而且我认为此时查询应该看起来很清楚:选择没有他们就没有酒吧的所有饮酒者。
关于mysql - Double Not Exists SQL 逻辑解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32739694/