我很困惑 PROJECT A(r - s) 和 PROJECT A(r) - PROJECT A(s) 在 RDBMS 中的表达方式有何不同。任何人都可以举一个例子来证明上面吗?
2 回答
s = [x y]
0 0
1 1
2 2
r = [x y]
0 0
0 1
0 2
1 1
1 2
2 2
A = {y}
PROJECT A(r − s)=[y]
1
2
PROJECT A(r) − PROJECT A(s)=[y]
以下是如何生成(反)这样的示例。OP 问题转化为QBQL断言:
a <AND> TABLE_DUM = a & r <AND> TABLE_DUM =s <AND> TABLE_DUM
->
a v ( r <AND> <NOT> s ) = (a v r) <AND> <NOT> (a v s).
除了"v"
(广义投影)之外的所有操作都来自 D&D 代数 A。前两个蕴含条件要求关系a
为空,关系r
和s
具有相同的标题。它输出:
s = [p]
0
;
r = [p]
1
;
a = [r]
;
*** False Assertion ***
尽管这是合理的答案,但有些人可能会对将关系投影到不属于标题的属性的想法感到不舒服。需要为a
和r
标题重叠添加一个条件:(a v s) <AND> TABLE_DUM != TABLE_DUM
. 然后,属性 {p,r} 应手动转换为 OP 的 {x,y}。(这是引入 Erwin 注意到的错误的地方)。
r = { TUPLE {X 1 , Y 1} }
s = { TUPLE {X 1 , Y 2} }
r MINUS s = r = { TUPLE {X 1 , Y 1} }
Take projections over X (A = {X} ???)
r PROJECT {X} === { TUPLE {X 1} }
s PROJECT {X} === { TUPLE {X 1} }
(r PROJECT {X}) MINUS (s PROJECT {X}) === { }
(r MINUS s) PROJECT {X} === { TUPLE {X 1} }
它是 s 中的 Y 2 部分。这就是 r 和 s 中的元组之间的区别。如果您首先“投射出这种差异”,那么之后剩下的一切都是平等的,计算平等事物之间的差异当然根本不算什么。
但是,如果您首先计算差异,那么 s 中的元组中的 Y 2 部分会导致 r 中的元组(粗略地说)不会从结果中丢弃,然后对该结果进行投影当然会产生一些非空的东西。