Answers:
在关系代数中,我们将首先提供左(外)连接的非正式定义,然后证明它可以通过重命名,选择,连接和投影来构造差异,并且可以使用差异,选择和联合来构造。左(外)联接。实际上,我们最终将以相反的顺序进行操作:我们将展示如何使用差异构造左联接,然后我们将展示如何使用左侧联接构造差异。
令R
让瓦特= (ε ,ε ,。。。,ε )R LEFT JOIN S
是属于模式(R ',T ,S ')的所有元组(r ,t ,s )的集合,其中...
例如:- [R的模式是(甲1,阿2,阿3),小号的模式是(甲2,甲3,甲4),我们有- [R = { (1 ,2 ,3 ),(4 ,5 ,6 )}和小号= { (2 ,3 ,4 )
定理:R LEFT JOIN S
等同于(R EQUIJOIN S) UNION ((((PROJECT_T R) DIFFERENCE (PROJECT_T S)) EQUIJOIN R) JOIN w)
。
证明:(R EQUIJOIN S)
为我们提供了(1)和(2a)所需的一切。我们声称,这((((PROJECT_T R) DIFFERENCE (PROJECT_T S)) EQUIJOIN R) JOIN w)
给了我们(r, t, w)
(2b)和(3)所需形式的一切。
要看到这一点,首先要注意的(((PROJECT_T R) DIFFERENCE (PROJECT_T S)) EQUIJOIN R)
是R中所有元组的集合,而S中没有相应的元组。看到这一点,足以注意到,通过从R和S(属性集T)中投射出公共属性并取其差值,就剩下了一个,只剩下R中表示的那些元组(具有模式T),但是不š。通过与[R ,我们恢复所有只有在那些元组- [R ,其具有用于在属性值Ť其存在于ř但不是在小号EQUIJOIN
接下来,注意w的模式与R的模式(((PROJECT_T R) DIFFERENCE (PROJECT_T S))
相同(即(R ',T )),而w的模式为S '。所述因此操作是笛卡尔乘积,我们我们得到的形式的所有元组([R ,吨,瓦特)在没有(吨,š )在小号对应于(- [R ,吨)在ř。JOIN
要看到,这恰恰是设置我们需要添加到元组R EQUIJOIN S
,以构建R LEFT JOIN S
,考虑以下事项:施工,(3)满足,因为R EQUIJOIN S
不能包含([R ,牛逼,S ^ ),如果包含([R ,牛逼,w )(如果这样做,那么第二部分的包含(r ,t ,w )将是一个矛盾);如果我们要增加另一个([R ,牛逼,w ^ )不在,然后会出现一个(((((PROJECT_T R) DIFFERENCE (PROJECT_T S)) EQUIJOIN R) JOIN w)
((((PROJECT_T R) DIFFERENCE (PROJECT_T S)) EQUIJOIN R) JOIN w)
吨,š )在小号对应于(- [R ,吨)在 [R ,和通过的定义,(- [R ,吨,š )也将是,(3矛盾)。这样就完成了证明。EQUIJOIN
R LEFT JOIN S
现在,我们证明左联接可用于构造差异:
定理:R DIFFERENCE S
相当于PROJECT_T(SELECT_{t'=w}(R LEFT JOIN (SELECT_{s=s'}(((S JOIN RENAME_{T->T'}(S)))))))
证明:请注意,此处的R '和S '为空,因为共享所有属性才有意义。首先,我们创建从一个新的关系小号通过复制在该属性集小号(由处理和),以便它是由元组(吨,吨')上属性集(Ť ,Ť ')其中吨= 吨'(由处理的)。左连接为我们留下了形式为(t ,t ')的元组DIFFERENCE
RENAME
JOIN
SELECT
SELECT
. The last PROJECT
gets rid of the temporary attribute set T′
例如:设ř = { (1 ,2 ),(3 ,4 ),(5 ,6 )}和小号= { (3 ,4 ),(5 ,6 ),(7 ,8 )}。我们首先得到小号与d属性集Ť ':{ (3 ,4 )RENAME
JOIN
SELECT
LEFT JOIN
ř给出 { (1 ,2 ,ε ,ε ),(3 ,4 ,3 ,4 ),(5 ,6 ,5 ,6 )}。在给出 { (1 ,2 ,ε ,ε )}。在给出 { (1 ,2 )},期望的答案。SELECT
PROJECT
SELECT
).
DIFFERENCE
to define LEFT JOIN
, and then you use LEFT JOIN
to express DIFFERENCE
, concluding that SQL can do without it. For this to be valid, you should express LEFT JOIN
in terms of operators other than DIFFERENCE
, and then prove that DIFFERENCE
is equivalent to it.
LEFT JOIN as implemented by SQL, does not produce relations as its result (because some attributes of the result will not have a value).
Ergo, LEFT JOIN as implemented by SQL, is not a direct counterpart of any relational algebra operator.
Ergo, The relational difference operator cannot be expressed in terms of LEFT JOIN (because LEFT JOIN cannot possibly be part of the relational algebra, this being because LEFT JOIN produces something that is not a relation, thus violating closure of the algebra).
Any set of primitive operators of a relational algebra that satisfies closure that I know of, always includes either relational difference or else relational semidifference.