集合差演算子(たとえば、EXCEPT
一部のSQLバリアント)は、関係代数の多くの基本的な演算子の1つです。ただし、差集合演算子を直接サポートしていないデータベースもありますがLEFT JOIN
(外部結合の一種)、実際には同じ効果を得るために差集合操作の代わりにこれを使用できます。
これは、LEFT JOIN
演算子が維持されている限り、クエリ言語の表現力が集合差演算子がなくても同じであることを意味しますか?この事実をどのように証明しますか?
集合差演算子(たとえば、EXCEPT
一部のSQLバリアント)は、関係代数の多くの基本的な演算子の1つです。ただし、差集合演算子を直接サポートしていないデータベースもありますがLEFT JOIN
(外部結合の一種)、実際には同じ効果を得るために差集合操作の代わりにこれを使用できます。
これは、LEFT JOIN
演算子が維持されている限り、クエリ言語の表現力が集合差演算子がなくても同じであることを意味しますか?この事実をどのように証明しますか?
回答:
リレーショナル代数では、最初に左(外部)結合の非公式の定義を提供し、それを変更して、名前の変更、選択、結合、射影が差異を構築できること、およびその差異、選択、およびユニオンを使用して構築できることを証明します左(外側)に参加します。実際には、逆の順序で実行します。差分を使用して左結合を構築する方法を示し、次に左結合を使用して差分を構築する方法を示します。
LET 及びS有するスキーマ(R '、T )及び(T 、S ')ここで、それぞれ、R '及びSは、'のスキーマの属性のセットが、他のものではなく、Tは、共通属性の集合です。
ましょうスキーマのNULLタプルであるS '。つまり、S ′の各属性のすべてのヌル値で構成されるタプルです。その後、我々は、外側左定義すると、次の参加:すべてのタプルの集合である(R 、T 、Sは)スキーマに属する(R '、T 、S ')ここで、...R LEFT JOIN S
例:のスキーマは、(A 1、A 2、A 3)、S、Sスキーマである' (A 2、A 3、A 4)、そして我々は持っているRを= { (1 、2 、3 )、(4 、5 、6 )}とS = { (2 、3 、4 )。(1)及び(2)によって、我々は、中間結果を取得 { (1 、2 、3 、4 )、(1 、2 、3 、6 )、(1 、2 、3 、ε )、(4 、5 、6 、ϵ )}。(3)により、我々は削除する必要があります(1 、2、我々は、(例えば)持っているので(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に対応するタプルがないのすべてのタプルのセットです。それを確認するには、RとS(属性セットT)から共通の属性を射影し、差を取ることにより、Rで表されるすべてのタプル(スキーマTのみ)が残ることに注意するだけで十分です。Sではありません。ことでとR、我々は内のすべてのとのみタプル回復R内の属性の値が持つTに存在するRはなく、中にSをEQUIJOIN
; つまり、これまでに主張したタプルのセットです。
次に、のスキーマはRのスキーマと(((PROJECT_T R) DIFFERENCE (PROJECT_T S))
同じであることに注意してください(つまり、(R ′、T ))、wのスキーマはS ′です。動作は、我々は、フォームのすべてのタプルを取得し、従ってデカルト積である(R 、T 、W )が全くされていない場合(T 、よ)にSに対応する(R 、T )においてR。JOIN
これは正確に我々がに追加するために必要なタプルの集合であることを確認するにR EQUIJOIN S
構築するためにR LEFT JOIN S
、次の点を考慮してください建設、(3)であるため、満たされるR EQUIJOIN S
缶が含まれていないもし含まれている(R 、T 、w )(もしそうなら、2番目の部分を含む(r 、t 、w )は矛盾するでしょう); 私たちは別の追加した場合(R 、T 、Wは)ないで、そこになります(((((PROJECT_T R) DIFFERENCE (PROJECT_T S)) EQUIJOIN R) JOIN w)
((((PROJECT_T R) DIFFERENCE (PROJECT_T S)) EQUIJOIN R) JOIN w)
における Sは、対応する(R 、T )に R、及びの定義により、(R 、T 、Sは)もであろう)(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)))))))
証明:ここでは、すべての属性が意味をなすために共有されているため、とS ′は空であることに注意してください。まず、我々はより新しい関係作成Sに属性セットを複製することにより、S(によって処理し、それがタプルで構成さそうということ)(T 、T ")属性セットに(T 、T ")T = T "(によって処理を)。左のフォームのタプルと葉にご参加(トン、トン」)DIFFERENCE
RENAME
JOIN
SELECT
ここで、またはt ′ = wです。ここで、Sにも現れるエントリを取り除くために、最も外側で処理される形式(t 、w )のタプルのみを保持する必要があります。最後のものは、一時属性セットT ′を取り除き、元のスキーマに関する違いを残します。SELECT
PROJECT
RENAME
JOIN
SELECT
LEFT JOIN
SELECT
PROJECT
DIFFERENCE
定義するためLEFT JOIN
に使用している、そしてあなたLEFT JOIN
が表現するために使用しDIFFERENCE
、SQLがそれなしで行うことができると結論付けます。これを有効にするには、以外LEFT JOIN
の演算子で表現し、それがそれと同等であることを証明する必要があります。DIFFERENCE
DIFFERENCE
SQLによって実装されるLEFT JOINは、結果としてリレーションを生成しません(結果の一部の属性には値がないため)。
SQLで実装されているErgo、LEFT JOINは、リレーショナル代数演算子の直接の対応物ではありません。
エルゴ、関係の差演算子はLEFT JOINで表現できません(LEFT JOINは関係代数の一部ではない可能性があります。これは、LEFT JOINが関係ではない何かを生成し、代数の閉包に違反するためです)。
私が知っている閉包を満たす関係代数の原始演算子のセットには、常に関係の差または関係の半差が含まれます。