如何在关系代数中表示子查询?我是否将新选择置于先前的选择条件下?
SELECT number
FROM collection
WHERE number = (SELECT anotherNumber FROM anotherStack);
答案 0 :(得分:8)
您只需将其重写为join
。
我不确定我在关系代数中学到的语法有多广泛使用。
anotherNumber
anotherStack
anotherNumber
重命名为number
collection
number
进行最终预测答案 1 :(得分:1)
答案取决于你的代数包含哪些运算符。半连接运算符在这里最有用。
如果公共属性在两个关系中都被命名为number
,则它将是半连接,然后是number
的投影。假设一个名为MATCHING
的sem-join运算符,按Tutorial D:
( collection MATCHING anotherStack ) { number }
发布后,首先需要重命名该属性:
( collection MATCHING ( anotherStack RENAME { anotherNumber AS number } ) { number }
如果可以考虑标准SQL(SQL-92)JOIN
,松散地说,关系运算符那么SQL就没有没有半连接。但是,它有几个比较谓词可用于编写半连接运算符,例如MATCH
:
SELECT number
FROM collection
WHERE MATCH (
SELECT *
FROM collection
WHERE collection.number = anotherNumber.anotherStack
);
但是,MATCH
在现实生活中的SQL产品中并未得到广泛支持,因此半连接通常使用IN (subquery)
或EXISTS (subquery)
编写(我怀疑这就是您命名的原因 - 在你的问题中检查了“子查询”,即术语半连接在SQL从业者中并不为人所知。)
另一种方法是使用交叉运算符(如果可用)。
像(伪代码):
( collection project number )
intersect
( ( anotherStack rename anotherNumber as number ) project number )
在SQL中:
SELECT number
FROM collection
INTERSECT
SELECT anotherNumber
FROM anotherStack;
这在现实生活中得到了很好的支持(SQL Server,Oracle,PostgreSQL等,但特别是MySQL)。
答案 2 :(得分:0)
根据this pdf,您可以轻松地将子查询转换为关系代数表达式。
首先,您必须从表单转换整个查询
SELECT Select-list FROM R1 T1, R2 T2, ...
WHERE
some-column = (
SELECT some-column-from-sub-query from r1 t1, r2 t2, ...
WHERE extra-where-clause-if-needed)
到
SELECT Select-list FROM R1 T1, R2 T2, ...
WHERE
EXISTS (
SELECT some-column-from-sub-query from r1 t1, r2 t2, ...
WHERE extra-where-clause-if-needed and some-column = some-column-from-sub-query)
然后,您必须先将子查询转换为关系代数。为此,请针对上面给出的子查询:
PI[some-column-from-sub-query](
SIGMA[extra-where-clause-if-needed
^ some-column = some-column-from-sub-query
](RO[T1](R1) x RO[T2](R2) x ... x RO[t1](r1) x RO[t2](r2) x ...)
)
R1, R2...
是上下文关系,r1, r2...
是子查询关系。
由于语法在堆栈溢出中非常糟糕,请转到that pdf以获取有关如何将子查询转换为关系代数的广泛概述。