有两张桌子,一张叫做饮用者,有一列名字,另一张叫有频道,有2列,饮酒者和酒吧(经常这样)。
我有一个回答这个陈述的查询:
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
时,我最难遵循逻辑。
如果有人可以告诉我如何理解这些类型的查询,我们将不胜感激。谢谢。
答案 0 :(得分:4)
您可以尝试从内到外展开这些类型的查询。所以,从最后一个子查询开始:
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)
我认为在这一点上,查询应该看起来很清楚:选择所有没有酒吧的饮酒者。
答案 1 :(得分:1)
我不知道你是否绝对需要通过那些 NOT EXISTS 循环,因为你可以做这样的事情
def webapp_add_wsgi_middleware(app):
from google.appengine.ext.appstats import recording
app = recording.appstats_wsgi_middleware(app)
return app
webapp_add_wsgi_middleware(api_app)
基本上,您计算了酒吧的总数,然后将每个人的常用酒吧数量与该数字进行比较。在COUNT中添加 distinct 子句可以忽略重复项。