【问题标题】:Find all pizzerias that serve ONLY pizzas eaten by people over 30查找所有仅提供 30 岁以上人士食用的比萨饼的比萨饼店
【发布时间】:2019-07-26 08:00:04
【问题描述】:

我知道正确答案,但我不太确定其中的一部分。

RA 是一个关系代数解释器,它将关系代数查询转换为 SQL 查询,然后在标准关系数据库系统上执行 SQL。因此该语言类似于 SQL,但基于关系代数。

这里是示例数据库:

Serves(pizzeria, pizza, price)
Eats (name, pizza) 
Person (name, age, gender) 

查找所有仅提供 30 岁以上人士食用的比萨饼的比萨店

    \project_{pizzeria} Serves
\diff
    \project_{pizzeria} (
            Serves
        \join (
                (\project_{pizza} Serves)
            \diff (\project_{pizza} ((\select_{age>'30'} Person) \join Eats))
        )
    )

我不明白的是查询的最后一部分:

\project_{pizza} ((\select_{age>'30'} Person) \join Eats)

您不想区分年龄 30 吗?这将减去所有小于 30 岁的年龄,并留下所有年龄 > 30 岁的人,不是吗?然而,我知道这是错误的。有人能解释一下这背后的逻辑吗?

【问题讨论】:

  • 请查看您查询的格式化版本并去掉反斜杠、下划线和花括号——它们是此处未使用的格式元字符。请阅读编辑帮助:在普通文本中,如果您想要换行符,请以两个空格结束该行。请合理缩进代码以反映嵌套
  • 不>30的人是
  • 当您引用某人时(例如他们网页上对 RA 的描述),请给予他们信任并格式化为引用。请参阅块引用格式的编辑帮助。另外请让您的问题文本完整,不要只在标题中添加需要的内容。

标签: relational-database relational-algebra


【解决方案1】:

不要妄下结论。仔细阅读。

project {pizza} (select {age>'30'} (Person) join Eats)

这个说法涉及30岁以上的人。但这不是最终的答案。

你从其他东西中减去这些元组。如果你从所有人中减去 30 岁以上的人,那么你将得到不超过 30 岁的人。这不是 30 岁以上的人,你没有从所有人中减去它。它是 30 岁以上的人吃过的比萨饼,你从所有比萨饼中减去它,得到 30 岁以上的人没有吃过的比萨饼。

    project {pizza} (Serves)
-   project {pizza} (select {age>'30'} (Person) join Eats)

稍后你会得到那些比萨饼的比萨店,即那些提供 30 岁以上的人不吃的比萨饼的比萨店。

project {pizzeria} (
        Serve
    join (
            project {pizza} (Serves)
        -   project {pizza} (select {age>'30'} (Person) join Eats)
        )

然后你从所有比萨店中减去它们,得到只供应 30 岁以上的人吃的比萨饼的比萨店。

    project {pizzeria} (Serves)
-   project {pizzeria} (
           Serve
       join (
               project {pizza} (Serves)
           -   project {pizza} (select {age>'30'} (Person) join Eats)
           )
       )

因此,您永远不会对 30 岁以上的人进行差异/减去/减去。特别是,您永远不会从所有人中减去他们以获得不超过 30 岁的人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-20
    • 2014-08-28
    • 2016-06-30
    • 2011-12-22
    • 1970-01-01
    • 1970-01-01
    • 2010-11-27
    相关资源
    最近更新 更多