関係代数でサブクエリを表すにはどうすればよいですか?新しい選択を以前の選択条件の下に置きますか?
SELECT number
FROM collection
WHERE number = (SELECT anotherNumber FROM anotherStack);
関係代数でサブクエリを表すにはどうすればよいですか?新しい選択を以前の選択条件の下に置きますか?
SELECT number
FROM collection
WHERE number = (SELECT anotherNumber FROM anotherStack);
それを。として書き直すだけですjoin
。
関係代数で学んだ構文が言葉でどれほど広く使われているかはわかりません。
anotherNumber
からの投影を取るanotherStack
anotherNumber
手順1の結果から名前を次のように変更しますnumber
collection
number
ステップ3の結果からの最終的な予測を取ります答えは、代数がどの演算子を構成しているかによって異なります。ここでは、半結合演算子が最も役立ちます。
共通の属性がnumber
両方の関係で指定されている場合、それは半結合とそれに続く。の射影になりnumber
ます。チュートリアルDMATCHING
のように、という名前のsem-join演算子を想定します。
( collection MATCHING anotherStack ) { number }
投稿されたとおり、最初に属性の名前を変更する必要があります。
( collection MATCHING ( anotherStack RENAME { anotherNumber AS number } ) { number }
標準SQL(SQL-92)JOIN
を大まかに言えば関係演算子と見なすことができれば、SQLには半結合がないのは事実です。ただし、半結合演算子を記述するために使用できるいくつかの比較述語があります。例MATCH
:
SELECT number
FROM collection
WHERE MATCH (
SELECT *
FROM collection
WHERE collection.number = anotherNumber.anotherStack
);
ただし、MATCH
実際のSQL製品では広くサポートされていないため、セミジョインは一般的にIN (subquery)
またはを使用して記述されEXISTS (subquery)
ます(そのため、質問で「サブクエリ」の名前をチェックしました。つまり、セミジョインという用語はあまり知られていません。 SQLの実践者)。
別のアプローチは、可能な場合は交差演算子を使用することです。
(擬似コード)のようなもの:
( collection project number )
intersect
( ( anotherStack rename anotherNumber as number ) project number )
SQLの場合:
SELECT number
FROM collection
INTERSECT
SELECT anotherNumber
FROM anotherStack;
これは実際には非常によくサポートされています(SQL Server、Oracle、PostgreSQLなどですが、特にMySQLはサポートされていません)。
このpdfによると、サブクエリをリレーショナル代数式に簡単に変換できます。
まず、フォームからクエリ全体を変換する必要があります
SELECT Select-list FROM R1 T1, R2 T2, ...
WHERE
some-column = (
SELECT some-column-from-sub-query from r1 t1, r2 t2, ...
WHERE extra-where-clause-if-needed)
に
SELECT Select-list FROM R1 T1, R2 T2, ...
WHERE
EXISTS (
SELECT some-column-from-sub-query from r1 t1, r2 t2, ...
WHERE extra-where-clause-if-needed and some-column = some-column-from-sub-query)
次に、最初にサブクエリを関係代数に変換する必要があります。上記のサブクエリに対してこれを行うには:
PI[some-column-from-sub-query](
SIGMA[extra-where-clause-if-needed
^ some-column = some-column-from-sub-query
](RO[T1](R1) x RO[T2](R2) x ... x RO[t1](r1) x RO[t2](r2) x ...)
)
R1, R2...
これがコンテキストリレーションであり、サブクエリリレーションr1, r2...
です。
構文はスタックオーバーフローではかなり厄介なので、そのpdfにアクセスして、サブクエリを関係代数に変換する方法の概要を確認してください。