Trong đại số quan hệ, trước tiên chúng ta sẽ cung cấp một định nghĩa không chính thức về phép nối trái (bên ngoài) và tiến hành chứng minh rằng nó, đổi tên, chọn, nối và chiếu có thể tạo ra sự khác biệt, cũng như sự khác biệt, lựa chọn và liên kết có thể được sử dụng để xây dựng trái (ngoài) tham gia. Trên thực tế, chúng tôi sẽ kết thúc việc thực hiện theo thứ tự ngược lại: chúng tôi sẽ trình bày cách tạo các liên kết bên trái bằng cách sử dụng các khác biệt và sau đó chúng tôi sẽ trình bày cách tạo các khác biệt bằng cách sử dụng các liên kết bên trái.
Hãy và S có lược đồ ( R ' , T ) và ( T , S ' ) , tương ứng, nơi R ' và S ' là bộ thuộc tính trong một schema nhưng không phải là khác, và T là tập hợp các thuộc tính chung.RS(R′,T)(T,S′)R′S′T
Hãy là tuple null cho schema S ' . Nghĩa là, nó là tuple bao gồm tất cả các giá trị null cho mỗi thuộc tính của S ' . Sau đó, chúng ta định nghĩa trái bên ngoài tham gia như sau: là tập hợp của tất cả các tuple ( r , t , s ) thuộc schema ( R ' , T , S ' ) nơi ...w=(ϵ,ϵ,...,ϵ)S′S′R LEFT JOIN S
(r,t,s)(R′,T,S′)
- là một tuple trong R ;(r,t)R
- (a) là một tuple của S hoặc (b) s = w ;(t,s)Ss=w
- Nếu nằm trong tập hợp cho s ≠ w , thì ( r , t , w ) không nằm trong tập hợp.(r,t,s)s≠w(r,t,w)
Ví dụ: 's schema là ( A 1 , A 2 , A 3 ) , S ' schema s là ( A 2 , A 3 , A 4 ) , và chúng tôi có mà R = { ( 1 , 2 , 3 ) , ( 4 , 5 , 6 ) } và S = { ( 2 , 3 , 4 )R(A1,A2,A3)S(A2,A3,A4)R={(1,2,3),(4,5,6)} . Bởi (1) và (2) chúng tôi nhận được kết quả trung gian { ( 1 , 2 , 3 , 4 ) , ( 1 , 2 , 3 , 6 ) , ( 1 , 2 , 3 , ε ) , ( 4 , 5 , 6 , ϵ ) } . Bởi (3) chúng ta phải loại bỏ ( 1 , 2S={(2,3,4),(2,3,6)}{(1,2,3,4),(1,2,3,6),(1,2,3,ϵ),(4,5,6,ϵ)} , vì chúng ta có (ví dụ) ( 1 , 2 , 3 , 4 ) và s = 4 ≠ ε = w . Do đó chúng tôi là trái với { ( 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,ϵ)}, kết quả mong đợi cho một tham gia trái.
Định lý: R LEFT JOIN S
tương đương với (R EQUIJOIN S) UNION ((((PROJECT_T R) DIFFERENCE (PROJECT_T S)) EQUIJOIN R) JOIN w)
.
Bằng chứng: (R EQUIJOIN S)
cung cấp cho chúng tôi mọi thứ theo yêu cầu của (1) và (2a). Chúng tôi tuyên bố rằng ((((PROJECT_T R) DIFFERENCE (PROJECT_T S)) EQUIJOIN R) JOIN w)
cung cấp cho chúng tôi mọi thứ theo mẫu (r, t, w)
theo yêu cầu của (2b) và (3).
Để thấy điều này, thông báo đầu tiên mà (((PROJECT_T R) DIFFERENCE (PROJECT_T S)) EQUIJOIN R)
là tập hợp của tất cả các bộ trong mà không có tuple tương ứng trong S . Để thấy điều đó, cần lưu ý rằng bằng cách chiếu các thuộc tính chung ra khỏi R và S (bộ thuộc tính T ) và lấy sự khác biệt, người ta chỉ còn lại tất cả các bộ dữ liệu (với lược đồ T ) được biểu thị trong R nhưng không S . Đến với R , chúng ta khôi phục lại tất cả và chỉ những bản ghi trong R có giá trị cho các thuộc tính trong T mà có mặt trong R nhưng không phải trong SRSRSTTRSEQUIJOIN
RRTRS; cụ thể là, chính xác là bộ tuple mà chúng ta đã tuyên bố cho đến nay.
Tiếp theo, thông báo rằng giản đồ của (((PROJECT_T R) DIFFERENCE (PROJECT_T S))
là giống như của (cụ thể là, ( R ' , T ) ), trong khi schema của w là S ' . Các vì thế hoạt động là một sản phẩm Descartes, chúng tôi chúng tôi nhận tất cả các bộ của mẫu ( r , t , w ) nơi không có ( t , s ) trong S tương ứng với ( r , t ) trong R .R(R′,T)wS′JOIN
(r,t,w)(t,s)S(r,t)R
Để thấy rằng đây chính xác là bộ tuple chúng ta cần thêm R EQUIJOIN S
vào để xây dựng R LEFT JOIN S
, hãy xem xét các điều sau: bằng cách xây dựng, (3) được thỏa mãn, vì R EQUIJOIN S
không thể chứa nếu chứa ( r , t , w ) (nếu có, thì phần thứ hai chứa ( r , t , w ) sẽ là một mâu thuẫn); nếu chúng ta thêm một ( r , t , w ) không vào , thì sẽ có một ((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)
trong S tương ứng với ( r , t ) trong R và theo định nghĩa của, ( r , t , s ) cũng sẽ nằm trongmột mâu thuẫn của (3). Điều này hoàn thành bằng chứng.(t,s)S(r,t)REQUIJOIN
(r,t,s)R LEFT JOIN S
Bây giờ chúng tôi cho thấy rằng tham gia trái có thể được sử dụng để xây dựng sự khác biệt:
Định lý: R DIFFERENCE S
tương đương vớiPROJECT_T(SELECT_{t'=w}(R LEFT JOIN (SELECT_{s=s'}(((S JOIN RENAME_{T->T'}(S)))))))
Chứng minh: Chú ý rằng ở đây, và S ' là sản phẩm nào, vì tất cả các thuộc tính được chia sẻ cho có ý nghĩa. Đầu tiên, chúng ta tạo ra một mối quan hệ mới từ S bằng cách sao chép các thiết lập thuộc tính trong S (xử lý bởi và ) để nó bao gồm các tuple ( t , t ' ) trên bộ thuộc tính ( T , T ' ) nơi t = t ' (xử lý bởi cái ). Việc nối bên trái để lại cho chúng ta các bộ dữ liệu có dạng ( t , t ′ )R′S′DIFFERENCE
SSRENAME
JOIN
(t,t′)(T,T′)t=t′SELECT
(t,t′)nơi hoặc t ' = w . Bây giờ, để loại bỏ các mục cũng xuất hiện trong S , chúng ta phải chỉ giữ các bộ dữ liệu có dạng ( t , w ) , được xử lý bởi lớp ngoài cùng . Cuối cùng được thoát khỏi những bộ tạm thời thuộc tính T ' và lá chúng tôi với sự khác biệt về giản đồ gốc.t=t′t′=wS(t,w)SELECT
PROJECT
T′
R={(1,2),(3,4),(5,6)}S={(3,4),(5,6),(7,8)}SRENAME
T′{(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,ϵ,ϵ),(3,4,3,4),(5,6,5,6)}SELECT
{(1,2,ϵ,ϵ)}PROJECT
{(1,2)}