查找所有只供应 30 岁以上的人吃过的比萨饼的比萨饼店

Find all pizzerias that serve ONLY pizzas eaten by people over 30

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

RA is a relational algebra interpreter that translates relational algebra queries into SQL queries, then executes the SQL on a standard relational database system. So the language is similar to SQL but based on relational algebra.

这是示例数据库:

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

Find all pizzerias that serve ONLY pizzas eaten by people over 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)

你不想区分 age < 30 而不是 age > 30 吗?这会减去所有小于 30 岁的年龄,剩下所有大于 30 岁的年龄,不是吗?然而,我知道这是错误的。有人可以解释这背后的逻辑吗?

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

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)
           )
       )

所以你永远不会 diff/minus/subtract 超过 30 岁的人。特别是,你永远不会从所有人中减去他们来得到不超过 30 岁的人。