双重不存在SQL逻辑解释

时间:2015-09-23 12:30:50

标签: mysql sql querying

有两张桌子,一张叫做饮用者,有一列名字,另一张叫有频道,有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时,我最难遵循逻辑。 如果有人可以告诉我如何理解这些类型的查询,我们将不胜感激。谢谢。

2 个答案:

答案 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 子句可以忽略重复项。