Nell'algebra relazionale, forniremo innanzitutto una definizione informale di join (esterno) sinistro e procederemo a dimostrare che, rinominazione, selezione, unione e proiezione possono costruire la differenza, così come la differenza, la selezione e l'unione possono essere utilizzate per costruire join sinistro (esterno). In realtà, finiremo per farlo nell'ordine inverso: mostreremo come costruire join a sinistra usando le differenze, e poi mostreremo come costruire differenze usando i join a sinistra.
Sia che S abbiano schemi ( R ′ , T ) e ( T , S ′ ) , rispettivamente, dove R ′ e S ′ sono gli insiemi di attributi in uno schema ma non l'altro, e T è l'insieme di attributi comuni.RS( R', T)( T, S')R'S'T
Lasciate sia la tupla nulla per lo schema S ' . Cioè, è la tupla composta da tutti i valori null per ogni attributo di S ′ . Quindi, definiamo il join esterno sinistro come segue: è l'insieme di tutte le tuple ( r , t , s ) appartenenti allo schema ( R ′ , T , S ′ ) dove ...w = ( ε , ε , . . . , ε )S'S'R LEFT JOIN S
( r , t , s )( R', T, S')
- è una tupla in R ;( r , t )R
- (a) è una tupla di S o (b) s = w ;( t , s )Ss = w
- Se è nell'insieme per s ≠ w , allora ( r , t , w ) non è nell'insieme.( r , t , s )s ≠ w( r , t , w )
Esempio: lo schema di è ( AR, loschema diSè( A 2 , A 3 , A 4 )e abbiamo cheR={(1,2,3),(4,5,6)}eS={(2,3,4)(A1,A2,A3)S(A2,A3,A4)R={(1,2,3),(4,5,6)} . Con (1) e (2) otteniamo il risultato intermedio { ( 1 , 2 , 3 , 4 ) , ( 1 , 2 , 3 , 6 ) , ( 1 , 2 , 3 , ϵ ) , ( 4 , 5 , 6 , ϵ ) } . Di (3) dobbiamo rimuovere ( 1 , 2S={(2,3,4),(2,3,6)}{(1,2,3,4),(1,2,3,6),(1,2,3,ϵ),(4,5,6,ϵ)} , poiché abbiamo (per esempio) ( 1 , 2 , 3 , 4 ) e s = 4 ≠ ϵ = w . Ci rimane quindi { ( 1 , 2 , 3 , 4 ) , ( 1 , 2 , 3 , 6 ) , ( 4 , 5 , 6 , ϵ ) }(1,2,3,ϵ)(1,2,3,4)s=4≠ϵ=w{(1,2,3,4),(1,2,3,6),(4,5,6,ϵ)}, il risultato previsto per un join sinistro.
Teorema: R LEFT JOIN S
è equivalente a (R EQUIJOIN S) UNION ((((PROJECT_T R) DIFFERENCE (PROJECT_T S)) EQUIJOIN R) JOIN w)
.
Prova: (R EQUIJOIN S)
ci dà tutto il necessario per (1) e (2a). Sosteniamo che ((((PROJECT_T R) DIFFERENCE (PROJECT_T S)) EQUIJOIN R) JOIN w)
ci fornisce tutto il modulo (r, t, w)
richiesto da (2b) e (3).
Per vedere questo, primo avviso che (((PROJECT_T R) DIFFERENCE (PROJECT_T S)) EQUIJOIN R)
è l'insieme di tutte le tuple in per i quali non corrisponde alcun tupla in S . Per vederlo, è sufficiente notare che proiettando gli attributi comuni su R e S (l'attributo set T ) e prendendo la differenza, si rimane con tutte e solo quelle tuple (con schema T ) che sono rappresentate in R ma non S . Dalla con R , si recupera tutte e sole le tuple in R che hanno valori per gli attributi a T che sono presenti in R ma non in SRSRSTTRSEQUIJOIN
RRTRS; vale a dire, precisamente l'insieme di tuple che abbiamo rivendicato finora.
Successivamente, si noti che lo schema di (((PROJECT_T R) DIFFERENCE (PROJECT_T S))
è uguale a quello di (ovvero, ( R ′ , T ) ), mentre lo schema di w è S ′ . L' operazione è quindi un prodotto cartesiano, che si ottengono tutti tuple nella forma ( r , t , w ) dove non c'è ( t , s ) in S corrispondente ad ( r , t ) in R .R(R′,T)wS′JOIN
(r,t,w)(t,s)S(r,t)R
Per vedere che questo è precisamente l'insieme di tuple che dovevamo aggiungere per R EQUIJOIN S
costruire R LEFT JOIN S
, considera quanto segue: per costruzione, (3) è soddisfatto, poiché R EQUIJOIN S
non può contenere se contiene ( r , t , w ) (se così fosse, allora la seconda parte contenente ( r , t , w ) sarebbe una contraddizione); se dovessimo aggiungere un altro ( r , t , w ) non in , allora ci sarebbe un ((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)
in S corrispondente a ( r , t ) in R , e dalla definizione di, ( r , t , s ) sarebbe ancheuna contraddizione di (3). Questo completa la prova.(t,s)S(r,t)REQUIJOIN
(r,t,s)R LEFT JOIN S
Ora mostriamo che il join sinistro può essere usato per costruire la differenza:
Teorema: R DIFFERENCE S
è equivalente aPROJECT_T(SELECT_{t'=w}(R LEFT JOIN (SELECT_{s=s'}(((S JOIN RENAME_{T->T'}(S)))))))
Prova: si noti che qui, e S ' sono vuote, in quanto tutti gli attributi sono condivise perdare un senso. Innanzitutto, creiamo una nuova relazione da S duplicando l'attributo set in S (gestito dae) in modo che sia composto da tuple ( t , t ′ ) sul set di attributi ( T , T ′ ) dove t = t ′ (gestito da il). L'unione sinistra ci lascia con le tuple della forma ( t , t ′ )R′S′DIFFERENCE
SSRENAME
JOIN
(t,t′)(T,T′)t=t′SELECT
(t,t′)dove o t ′ = w . Ora, per sbarazzarci delle voci che compaiono anche in S , dobbiamo mantenere solo le tuple del modulo ( t , w ) , che è gestito dal più esterno . L'ultimo elimina l'attributo temporaneo impostato T ′ e ci lascia con la differenza in termini di schema originale.t=t′t′=wS(t,w)SELECT
PROJECT
T′
Esempio: Let e S = { ( 3 , 4 ) , ( 5 , 6 ) , ( 7 , 8 ) } . Prima otteniamo S con l'attributo d impostato T ′ : { ( 3 , 4 ), ( 5 R dà { ( 1 , 2 , ϵ , ϵ ) , ( 3 ,R={(1,2),(3,4),(5,6)}S={(3,4),(5,6),(7,8)}SRENAME
T′ . L'operazione ci dà il prodotto cartesiano con tutti e nove i possibili abbinamenti; questo set non è scritto qui per motivi di formattazione. L'analisi quindi si riduce a { ( 3 , 4 , 3 , 4 ) , ( 5 , 6 , 5 , 6 ) , ( 7 , 8 , 7 , 8 ) } . Ilcon{(3,4),(5,6),(7,8)}JOIN
SELECT
{(3,4,3,4),(5,6,5,6),(7,8,7,8)}LEFT JOIN
R . Ildà { ( 1 , 2 , ε , ε ) } . Ildà { ( 1 , 2 ) } , la risposta desiderata.{(1,2,ϵ,ϵ),(3,4,3,4),(5,6,5,6)}SELECT
{(1,2,ϵ,ϵ)}PROJECT
{(1,2)}