Dans l'algèbre relationnelle, nous fournirons d'abord une définition informelle de la jointure gauche (externe), et continuerons à prouver que le renommage, la sélection, la jointure et la projection peuvent construire la différence, ainsi que cette différence, la sélection et l'union peuvent être utilisées pour construire jointure externe gauche. En fait, nous finirons par le faire dans l'ordre inverse: nous montrerons comment construire des jointures gauches en utilisant des différences, puis nous montrerons comment construire des différences en utilisant des jointures gauches.
Soit et des schémas et , respectivement, où et sont les ensembles d'attributs dans un schéma mais pas l'autre, et est l'ensemble d'attributs communs.S ( R ′ , T ) ( T , S ′ ) R ′ S ′ TRS(R′,T)(T,S′)R′S′T
Soit le tuple nul pour le schéma . C'est-à-dire qu'il s'agit du tuple composé de toutes les valeurs nulles pour chaque attribut de . Ensuite, nous définissons la jointure externe gauche comme suit: est l'ensemble de tous les tuples appartenant au schéma où ...S ' S ' ( r , t , s ) ( R ' , T , S ' )w=(ϵ,ϵ,...,ϵ)S′S′R LEFT JOIN S
(r,t,s)(R′,T,S′)
- R(r,t) est un tuple dans ;R
- (a) est un tuple de ou (b) ;S s = w(t,s)Ss=w
- Si est dans l'ensemble pour , alors n'est pas dans l'ensemble.s ≠ w ( r , t , w )(r,t,s)s≠w(r,t,w)
Exemple: le schéma de est , le schéma de est , et nous l'avons et . Par (1) et (2) on obtient le résultat intermédiaire . Par (3), nous devons supprimer , car nous avons (par exemple) et . Il nous reste donc , le résultat attendu pour une jointure gauche.RS ( A 2 , A 3 , A 4 ) R = { ( 1 , 2 , 3 ) , ( 4 , 5 , 6 ) } S = { ( 2 , 3 , 4 ) , ( 2 , 3 , 6 ) } {(A1,A2,A3)S(A2,A3,A4)R={(1,2,3),(4,5,6)}S={(2,3,4),(2,3,6)}( 1 , 2 , 3 , ϵ ) ( 1 , 2 , 3 , 4 ) s = 4{(1,2,3,4),(1,2,3,6),(1,2,3,ϵ),(4,5,6,ϵ)}(1,2,3,ϵ)(1,2,3,4){ ( 1 , 2 , 3 , 4 ) , ( 1 , 2 , 3 , 6 ) , ( 4 , 5 , 6 , ϵ ) }s=4≠ϵ=w{(1,2,3,4),(1,2,3,6),(4,5,6,ϵ)}
Théorème: R LEFT JOIN S
est équivalent à (R EQUIJOIN S) UNION ((((PROJECT_T R) DIFFERENCE (PROJECT_T S)) EQUIJOIN R) JOIN w)
.
Preuve: (R EQUIJOIN S)
nous donne tout ce qui est requis par (1) et (2a). Nous prétendons que cela ((((PROJECT_T R) DIFFERENCE (PROJECT_T S)) EQUIJOIN R) JOIN w)
nous donne tout de la forme (r, t, w)
requise par (2b) et (3).
Pour le voir, premier avis qui (((PROJECT_T R) DIFFERENCE (PROJECT_T S)) EQUIJOIN R)
est l'ensemble de toutes les lignes en pour lesquels il n'y a pas tuple correspondant dans . Pour voir cela, il suffit de noter qu'en projetant les attributs communs de et (l'ensemble d'attributs ) et en prenant la différence, on se retrouve avec tous et seulement les tuples (avec le schéma ) qui sont représentés dans mais pas . Par le avec , nous récupérons tous et seulement les tuples dans qui ont des valeurs pour les attributs dans qui sont présents dans mais pas dansS R S T T R S R R T R SRSRSTTRSEQUIJOIN
RRTRS; à savoir, précisément l'ensemble de tuples que nous avons jusqu'à présent revendiqué.
Ensuite, notez que le schéma de (((PROJECT_T R) DIFFERENCE (PROJECT_T S))
est le même que celui de (à savoir, ), tandis que le schéma de est . L' opération est donc un produit cartésien, nous nous obtenons toutes les lignes de la forme où il n'y a pas en correspondant à dans .( R ′ , T ) w S ′ ( r , t , w ) ( t , s ) S ( r , t ) RR(R′,T)wS′JOIN
(r,t,w)(t,s)S(r,t)R
Pour voir que c'est précisément l'ensemble de tuples que nous devions ajouter pour R EQUIJOIN S
construire R LEFT JOIN S
, considérons ce qui suit: par construction, (3) est satisfait, car R EQUIJOIN S
ne peut pas contenir si contient (si c'était le cas, alors la deuxième partie contenant serait une contradiction); si nous devions ajouter un autre pas dedans, alors il y aurait un dans correspondant à dans , et par la définition de , serait également en contradiction avec (3). Ceci complète la preuve.( r , t , w ) ( r , t , w ) ( r , t , w ) ( t , s ) S ( r , t ) R ( r , t , s )(r,t,s)((((PROJECT_T R) DIFFERENCE (PROJECT_T S)) EQUIJOIN R) JOIN w)
(r,t,w)(r,t,w)(r,t,w)((((PROJECT_T R) DIFFERENCE (PROJECT_T S)) EQUIJOIN R) JOIN w)
(t,s)S(r,t)REQUIJOIN
(r,t,s)R LEFT JOIN S
Nous montrons maintenant que la jointure gauche peut être utilisée pour construire la différence:
Théorème: R DIFFERENCE S
est équivalent àPROJECT_T(SELECT_{t'=w}(R LEFT JOIN (SELECT_{s=s'}(((S JOIN RENAME_{T->T'}(S)))))))
Preuve: notez qu'ici, et sont vides, car tous les attributs sont partagés pour avoir du sens. Tout d'abord, nous créons une nouvelle relation à partir de en dupliquant l'ensemble d'attributs dans (géré par et ) afin qu'il se compose de tuples sur l'ensemble d'attributs où (géré par le ). La jointure gauche nous laisse avec des tuples de la forme où ou . Maintenant, pour se débarrasser des entrées qui apparaissent également en , il ne faut garder que les tuples du formulaireS ′R′S′DIFFERENCE
S ( t , t ′ ) ( T , T ′ ) t = t ′ ( t , t ′ ) t = t ′ t ′ = w S ( t , w ) T ′SSRENAME
JOIN
(t,t′)(T,T′)t=t′SELECT
(t,t′)t=t′t′=wS(t,w), qui est géré par le plus externe SELECT
. Le dernier PROJECT
se débarrasse de l'ensemble d'attributs temporaires et nous laisse la différence en termes de schéma d'origine.T′
Exemple: Soit et . Nous obtenons d'abord avec l' ensemble d'attributs d : . L' opération nous donne le produit cartésien avec les neuf paires possibles; cet ensemble n'est pas écrit ici pour des raisons de formatage. Le pares alors cela à . Le avec donne . Le donne . Le donneS = { ( 3 , 4 ) , ( 5 , 6 ) , ( 7 , 8 ) } S T ′ { ( 3 , 4 ) , ( 5 , 6 ) , ( 7 ,R={(1,2),(3,4),(5,6)}S={(3,4),(5,6),(7,8)}SRENAME
T′{ ( 3 , 4 , 3 , 4 ) , ( 5 , 6 , 5 , 6 ) , ( 7 , 8 , 7 , 8 ) } R { ( 1 , 2 , ϵ , ϵ ) , ( 3 , 4 , 3 , 4 ) , ( 5 , 6 ,{(3,4),(5,6),(7,8)}JOIN
SELECT
{(3,4,3,4),(5,6,5,6),(7,8,7,8)}LEFT JOIN
R{ ( 1 , 2 , ϵ , ϵ ) } { ( 1 , 2 ) }{(1,2,ϵ,ϵ),(3,4,3,4),(5,6,5,6)}SELECT
{(1,2,ϵ,ϵ)}PROJECT
{(1,2)}, la réponse souhaitée.