【问题标题】:Multiple correlated SQL queries多个相关的 SQL 查询
【发布时间】:2014-07-01 15:54:41
【问题描述】:

我有一个包含三个关系的关系模式:
具有(pid, pname, color, weight, city) 属性的关系产品
具有(jid, jname, city) 属性的
关系项目
Spj 与属性 (sid, pid, jid, quantity)

的关系

每个表都有一些元组。这不是一个现实的问题,而是一个关于 SQL 查询的练习。我需要找到的查询结果(由 3 个相关查询组成)如下:

SELECT p.pname
FROM product p
WHERE NOT EXISTS
      (SELECT *
       FROM project j
       WHERE j.city = 'athens'
       AND NOT EXISTS
           (SELECT *
            FROM spj
            WHERE spj.pid = p.pid
            AND spj.jid = j.jid));

我开始计算较低的查询,认为这是 3 个表之间的连接,但即使从一开始(我从连接 Spj 和 Project 表开始)我最终得到了一个包含 14 个元组的大表。所以,我认为我可能走错了方向。

我对两个元组变量(产品 p、项目 j)以及如何处理这些变量感到困惑。有人可以解释如何逐步进行此查询吗?是不是“三重”连接?

【问题讨论】:

  • 这是“向我展示雅典每个项目中使用的产品”你到底有什么问题?
  • 它们被称为“相关”子查询,而不是“级联”。正如@CharlesBretana 提到的,这是一个关系划分问题/查询。
  • @CharlesBretana 正如我上面所说,我的问题是我无法一步一步地进行这个查询来理解它是“向我展示雅典每个项目中使用的产品”的部门。你能更详细地解释一下你是如何分析这个查询的以及如何从这个模式中检索正确的元组吗?

标签: sql select join tuples database-schema


【解决方案1】:

向我展示雅典每个项目中使用的产品

等价于

向我展示雅典没有项目不使用该产品的产品。

最后一句话正是上面的查询所说的。

SELECT p.pname                      -- Show me the products 
FROM product p
WHERE NOT EXISTS                    -- where there is **no** project 
  (SELECT *
   FROM project j
   WHERE j.city = 'athens'          -- in Athens
      AND NOT EXISTS                -- that does not use
          (SELECT *  FROM spj
           WHERE spj.pid = p.pid    -- that product
             AND spj.jid = j.jid)) 

【讨论】:

  • 好的,所以我们一次获取每个产品(产品关系的元组)。对于这个产品,我们一次处理每个项目,我们检查这个项目的城市是否是雅典,查询 SELECT * FROM spj WHERE spj.pid = p.pid AND spj.jid = j.jid) 返回非空关系.如果至少有一个项目满足这一要求,我们会将这个产品的名称添加到最终结果中。对吗?
  • 查询所说的正是它所做的... 它会查找雅典市内没有项目且未使用该产品的所有产品。对于每个产品,如果在雅典使用,在雅典的每个项目上都包含在内,如果在雅典有任何单个项目不使用它,则排除在外。
  • 我得到了这个,但由于我不在计算机上执行它,我想确保我可以自己计算结果,因为给我的表格相对较大。感谢您的帮助!
猜你喜欢
  • 2016-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多