0
select age from person where name in (select name from eats where pizza="mushroom") 

我不确定要为“in”写什么。我应该如何解决这个问题?

4

3 回答 3

1

在这种情况下,子选择相当于一个连接:

select age 
from person p, eats e
where p.name = e.name and pizza='mushroom'

所以你可以把它翻译成:

π年龄(人 p ⋈<sub>p.name=e.name (σ Pizza='mushroom' (吃 e)))

于 2016-08-30T09:42:16.673 回答
0

对于基表 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 列,所以wherer 准确地保留了 r 的行,其 C 等于 r 中行的 C。这些是由natural join.

(对于这样的表达式where-in如果 C 不是 r 和 s 的列,则此翻译不适用。同样,反向翻译仅在某些条件下适用。)

这个特定的翻译对您有多大用处,或者您是否可以简化它或必须将其复杂化,取决于您使用的 SQL 和“关系代数”的变体、您对输入表达式的限制以及您做出的其他翻译决策。如果您使用非常简单和通用的翻译,那么输出会更复杂但显然是正确的。如果您在翻译过程中使用许多特殊情况规则和临时简化,那么输出会更简单,但答案正确的理由更长。

于 2016-08-31T17:39:21.907 回答
0

这是我的猜测。我假设集合成员符号是关系代数的一部分

在此处输入图像描述

于 2016-08-30T11:20:11.043 回答