select age from person where name in (select name from eats where pizza="mushroom")
我不确定要为“in”写什么。我应该如何解决这个问题?
select age from person where name in (select name from eats where pizza="mushroom")
我不确定要为“in”写什么。我应该如何解决这个问题?
在这种情况下,子选择相当于一个连接:
select age
from person p, eats e
where p.name = e.name and pizza='mushroom'
所以你可以把它翻译成:
π年龄(人 p ⋈<sub>p.name=e.name (σ Pizza='mushroom' (吃 e)))
对于基表 r,C 是 r 和 s 的列,x 是未使用的名称,
select ... from r where C in s
返回相同的值
select ... from r natural join (s) x
的使用in
要求 s 有一列。in
恰好当它的 C 等于 s 中的值时,对于一行 r 来说,它是正确的。因此,where
精确地保留了 r 的行,其 C 等于 s 中的值。我们假设 s 有 C 列,所以where
r 准确地保留了 r 的行,其 C 等于 r 中行的 C。这些是由natural join
.
(对于这样的表达式where
-in
如果 C 不是 r 和 s 的列,则此翻译不适用。同样,反向翻译仅在某些条件下适用。)
这个特定的翻译对您有多大用处,或者您是否可以简化它或必须将其复杂化,取决于您使用的 SQL 和“关系代数”的变体、您对输入表达式的限制以及您做出的其他翻译决策。如果您使用非常简单和通用的翻译,那么输出会更复杂但显然是正确的。如果您在翻译过程中使用许多特殊情况规则和临时简化,那么输出会更简单,但答案正确的理由更长。
这是我的猜测。我假设集合成员符号是关系代数的一部分