【问题标题】:Double Not Exists SQL Logic ExplanationDouble不存在SQL逻辑解释
【发布时间】:2015-12-20 18:40:47
【问题描述】:

有 2 张桌子,一张称为饮酒者,有一列名称,另一张称为常客,有 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 时,我最难遵循逻辑。 如果有人可以指导我如何理解这些类型的查询,将不胜感激。谢谢。

【问题讨论】:

    标签: mysql sql querying


    【解决方案1】:

    您可以尝试从内到外展开这类查询。所以,从最后一个子查询开始:

    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)
    

    我认为此时查询应该很清楚:选择所有没有酒吧的饮酒者。

    【讨论】:

      【解决方案2】:

      我不知道你是否绝对需要经历那些 NOT EXISTS 循环,因为你可以很好地做这样的事情

      SELECT d.name
      FROM drinkers d 
      INNER JOIN frequents f ON f.drinkerName = d.name
      GROUP BY d.name
      HAVING COUNT(distinct barName) = 
          (SELECT COUNT(distinct barName) 
           from frequents
      )
      

      基本上,您计算酒吧的总数,然后将每个人经常光顾的酒吧数量与该数字进行比较。在 COUNT 中添加那些 distinct 子句可以让您忽略重复项。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-07
        • 1970-01-01
        • 2020-04-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多