「差分」操作は、「結合」をすでに含むクエリ言語に表現力を追加しますか?


19

集合差演算子(たとえば、EXCEPT一部のSQLバリアント)は、関係代数の多くの基本的な演算子の1つです。ただし、差集合演算子を直接サポートしていないデータベースもありますがLEFT JOIN(外部結合の一種)、実際には同じ効果を得るために差集合操作の代わりにこれを使用できます。

これは、LEFT JOIN演算子が維持されている限り、クエリ言語の表現力が集合差演算子がなくても同じであることを意味しますか?この事実をどのように証明しますか?


1
それらが同じ表現力を持っていることを示すことは、左結合操作(およびRAの他の操作)を使用して差分操作を構築できることを示しています。
sxd

回答:


14

リレーショナル代数では、最初に左(外部)結合の非公式の定義を提供し、それを変更して、名前の変更、選択、結合、射影が差異を構築できること、およびその差異、選択、およびユニオンを使用して構築できることを証明します左(外側)に参加します。実際には、逆の順序で実行します。差分を使用して左結合を構築する方法を示し、次に左結合を使用して差分を構築する方法を示します。

LET 及びS有するスキーマR 'T 及びT S 'ここで、それぞれ、R '及びSは、'のスキーマの属性のセットが、他のものではなく、Tは、共通属性の集合です。RS(R,T)(T,S)RST

ましょうスキーマのNULLタプルであるS '。つまり、S ′の各属性のすべてのヌル値で構成されるタプルです。その後、我々は、外側左定義すると、次の参加:すべてのタプルの集合であるR T Sはスキーマに属するR 'T S 'ここで、...w=(ϵ,ϵ,...,ϵ)SSR LEFT JOIN S(r,t,s)(R,T,S)

  1. Rのタプルです。(r,t)R
  2. (a)Sのタプル、または(b)s = w ;(t,s)Ss=w
  3. 場合の設定にあるS W、次いでR T Wはセット内にはありません。(r,t,s)sw(r,t,w)

例:のスキーマは、A 1A 2A 3S、Sスキーマである' A 2A 3A 4、そして我々は持っているRを= { 1 2 3 4 5 6 }S = { 2 3 4 R(A1,A2,A3)S(A2,A3,A4)R={(1,2,3),(4,5,6)}。(1)及び(2)によって、我々は、中間結果を取得 { 1 2 3 4 1 2 3 6 1 2 3 ε 4 5 6 ϵ }。(3)により、我々は削除する必要があります1 2S={(2,3,4),(2,3,6)}{(1,2,3,4),(1,2,3,6),(1,2,3,ϵ),(4,5,6,ϵ)}、我々は、(例えば)持っているので1 2 3 4 S = 4 ε = wの。我々は、このようにして残されている { 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,ϵ)}、左結合の期待される結果。

定理:はとR LEFT JOIN S同等(R EQUIJOIN S) UNION ((((PROJECT_T R) DIFFERENCE (PROJECT_T S)) EQUIJOIN R) JOIN w)です。

証明:(R EQUIJOIN S)(1)および(2a)で必要なすべてを提供します。(2b)と(3)で必要な((((PROJECT_T R) DIFFERENCE (PROJECT_T S)) EQUIJOIN R) JOIN w)すべての形式を提供すると主張します(r, t, w)

これを見るために、最初に気づくの(((PROJECT_T R) DIFFERENCE (PROJECT_T S)) EQUIJOIN R)は、Sに対応するタプルがないのすべてのタプルのセットです。それを確認するには、RS(属性セットT)から共通の属性を射影し、差を取ることにより、Rで表されるすべてのタプル(スキーマTのみ)が残ることに注意するだけで十分です。Sではありません。ことでとR、我々は内のすべてのとのみタプル回復R内の属性の値が持つTに存在するRはなく、中にSをRSRSTTRSEQUIJOINRRTRS; つまり、これまでに主張したタプルのセットです。

次に、のスキーマはRのスキーマと(((PROJECT_T R) DIFFERENCE (PROJECT_T S))同じであることに注意してください(つまり、R T )、wのスキーマはS です。動作は、我々は、フォームのすべてのタプルを取得し、従ってデカルト積であるR T W が全くされていない場合T Sに対応するR T においてRR(R,T)wSJOIN(r,t,w)(t,s)S(r,t)R

これは正確に我々がに追加するために必要なタプルの集合であることを確認するにR EQUIJOIN S構築するためにR LEFT JOIN S、次の点を考慮してください建設、(3)であるため、満たされるR EQUIJOIN S缶が含まれていないもし含まれているR T w (もしそうなら、2番目の部分を含むr t w は矛盾するでしょう); 私たちは別の追加した場合R T Wはないで、そこになります(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)における Sは、対応するR T R、及びの定義により、R T Sはもであろう)(3の矛盾。これで証明が完了しました。(t,s)S(r,t)REQUIJOIN(r,t,s)R LEFT JOIN S

ここで、左結合を使用して差異を構築できることを示します。

定理:R DIFFERENCE Sと同等ですPROJECT_T(SELECT_{t'=w}(R LEFT JOIN (SELECT_{s=s'}(((S JOIN RENAME_{T->T'}(S)))))))

証明:ここでは、すべての属性が意味をなすために共有されているため、S は空であることに注意してください。まず、我々はより新しい関係作成Sに属性セットを複製することにより、S(によって処理し、それがタプルで構成さそうということ)T T "属性セットにT T "T = T "(によって処理を)。左のフォームのタプルと葉にご参加トントンRSDIFFERENCESSRENAMEJOIN(t,t)(T,T)t=tSELECT(t,t)ここで、またはt = wです。ここで、Sにも現れるエントリを取り除くために、最も外側で処理される形式t w のタプルのみを保持する必要があります。最後のものは、一時属性セットT を取り除き、元のスキーマに関する違いを残します。t=tt=wS(t,w)SELECTPROJECTT

R={(1,2),(3,4),(5,6)}S={(3,4),(5,6),(7,8)}SRENAMET{(3,4),(5,6),(7,8)}JOINSELECT{(3,4,3,4),(5,6,5,6),(7,8,7,8)}LEFT JOINR{(1,2,ϵ,ϵ),(3,4,3,4),(5,6,5,6)}SELECT{(1,2,ϵ,ϵ)}PROJECT{(1,2)}


(1,2)SELECT

@RaphaelこれにはLaTeXを使用すべきだと指摘してくれてありがとう。私はLaTeXで数学を計算し、コードをバックティックすることで誠実な試みをしました...他に何かするべきことがあれば教えてください。再度、感謝します!
Patrick87

まことにありがとうございます!インデントされた(インラインではない)数学の部分を作成するために$ $ ... $ $を検討することもできます。正しく使用すると、多くの場合、読みやすさが向上します。MathJaxは番号付き方程式もサポートしていますが、これを行う方法がわかりません。
ラファエル

ここであなたの論理に欠陥があると思います。あなたがDIFFERENCE定義するためLEFT JOINに使用している、そしてあなたLEFT JOINが表現するために使用しDIFFERENCE、SQLがそれなしで行うことができると結論付けます。これを有効にするには、以外LEFT JOINの演算子で表現し、それがそれと同等であることを証明する必要があります。DIFFERENCEDIFFERENCE
ジャノマ

@Janoma私はそれが必要だとは思わない...違いは左結合の観点から表現できることを示しようとしているので、機能する左結合が仮定されている。考えてみてください。あなたが言っていることがメリットがある場合、LEFT JOINは「基本的な」または「必要な」操作であると主張できます。私はそれぞれが他をシミュレートできることを示したので、どちらも他よりも「基本的」ではありません... DIFFERENCEを特別なものにしているのはなぜですか?小道具で。論理、NOTおよびANDは完全であり、ORおよびNOTは完全です。3つすべては必要ありません。
-Patrick87

-1

SQLによって実装されるLEFT JOINは、結果としてリレーションを生成しません(結果の一部の属性には値がないため)。

SQLで実装されているErgo、LEFT JOINは、リレーショナル代数演算子の直接の対応物ではありません。

エルゴ、関係の差演算子はLEFT JOINで表現できません(LEFT JOINは関係代数の一部ではない可能性があります。これは、LEFT JOINが関係ではない何かを生成し、代数の閉包に違反するためです)。

私が知っている閉包満たす関係代数の原始演算子のセットには、常に関係の差または関係の半差が含まれます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.