8

関係代数でサブクエリを表すにはどうすればよいですか?新しい選択を以前の選択条件の下に置きますか?

SELECT number
FROM collection
WHERE number = (SELECT anotherNumber FROM anotherStack);
4

3 に答える 3

11

それを。として書き直すだけですjoin

関係代数で学んだ構文が言葉でどれほど広く使われているかはわかりません。

  1. anotherNumberからの投影を取るanotherStack
  2. anotherNumber手順1の結果から名前を次のように変更しますnumber
  3. ナチュラルステップ2の結果をに結合しますcollection
  4. numberステップ3の結果からの最終的な予測を取ります
于 2010-10-05T12:01:21.060 に答える
1

答えは、代数がどの演算子を構成しているかによって異なります。ここでは、半結合演算子が最も役立ちます。

共通の属性が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はサポートされていません)。

于 2011-10-14T10:15:49.427 に答える
0

この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にアクセスして、サブクエリを関係代数に変換する方法の概要を確認してください。

于 2018-07-06T23:59:20.233 に答える