查找所有只供应 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 岁的人。
我知道正确答案,但我不太确定其中的一部分。
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 岁的人。