1

SQLクエリを関係代数に変換するのに助けが必要です。

SQLクエリは次のとおりです。

SELECT * FROM Customer, Appointment
WHERE Appointment.CustomerCode = Customer.CustomerCode
    AND Appointment.ServerCode IN
    (
        SELECT ServerCode FROM Appointment WHERE CustomerCode = '102'
    )
;

IN上記の例のサブクエリが原因でスタックしています。

このSQLクエリを関係代数で表現する方法を誰かに教えてもらえますか?

どうもありがとう。

編集:これが関係代数で提案された解決策です。これは正しいです?SQLクエリを再現しますか?

Scodes←ΠServerCode(σCustomerCode= '102'(予定))

Ccodes←ΠCustomerCode(Appointment⋉Scodes)

結果←(顧客⋉Ccodes)

4

2 に答える 2

4

SQLコードを使用すると、CustomerCodeの列が重複し、を使用するとSELECT [ALL]行が重複する可能性があります。結果は関係ではないため、関係代数で表現することはできません。

これらの問題はSQLで簡単に修正できます。

SELECT DISTINCT * 
  FROM Customer NATURAL JOIN Appointment
 WHERE Appointment.ServerCode IN
    (
        SELECT ServerCode FROM Appointment WHERE CustomerCode = '102'
    )
;

関心のある関係代数を指定しませんでした。DateとDarwenは、Aという名前の代数を提案し、 Dという名前のA言語を指定し、TutorialDという名前のD言語を設計しました。

チュートリアルDではJOIN、自然結合、WHERE制限、およびMATCHING半結合に演算子を使用しています。少し複雑なのは、SQLでの比較です。

CustomerCode = '102'

暗黙の強制により、SQLCustomerCodeの値と値の比較が可能です。CHARチュートリアルDはより厳密であり、タイプセーフである場合は、等式演算子をオーバーロードするか、より実際にはCHAR、タイプと同じ名前を持つのセレクター演算子を定義する必要があります。

したがって、上記の(改訂された)SQLは、チュートリアルDで次のように記述できます。

( Customer JOIN Appointment ) 
   MATCHING ( ( Appointment WHERE CustomerCode = CustomerCode ( '102' ) ) { ServerCode } )
于 2011-11-01T09:03:34.963 に答える
2

「この標準形式のRAでクエリを表すにはどうすればよいですか?」

「代数の種類」の問題ではなく、「表記の種類」の問題です。

ギリシャ語の記号を使用した表記では、通常、シグマ、シグマ文字に追加された添え字の制限条件、および制限の対象(制限条件の対象となる関係式)を使用します。

日付はその表記を避けます。そのような表記を使用して植字および/またはテキストを作成することは、通常、西洋のアルファベットだけを使用するよりもはるかに難しいためです(私の数学の先生は、数学の教科書にはすべての中で最も多くのエラーが含まれていると私たちに言ったことがあります)。

したがって、σ<cond>(<rel exp>)は、(日付の構文) "<rel exp>WHERE<cond>"とまったく同じ代数式を示します。

同様に、ギリシャ語の記号では、投影は通常、文字Piを使用して示され、下付き文字で保持されている属性のリストがPiに追加され、それに続く投影の対象となる式が使用されます。

したがって、Π<attr list>(<rel exp>)は、(Dateの構文) "<rel exp>{<attrlist>}"とまったく同じ代数式を示します。

演算子の結合ファミリは、通常、「ギリシャ文字」記号で、Unicode BOWTIE文字(のバリエーション)、または完全な円で囲まれた小文字の「x」で構成される文字(通常は完全な直積を表すために使用されます)を使用して示されます。クロス積、...あなたの代数コースがたまたまそれに名前を付けたものは何でも)。

一部のコースでは、ギリシャ文字のRhoを使用して、名前を変更するための「ギリシャ記号」表記が提供されています。下付き文字で追加されるのは、a1-> b1、a2-> b2、...の形式の名前変更リストです。その後に、名前変更の対象となる関係式が追加されます。同様に、Dateにはギリシャ語以外の記号と同等の構文があります。<rel exp> RENAME a1 AS b1、a2 AS b2、..。

重要なことは、これらの違いは単に構文表記の違いであり、「異なる代数」ではないことを確認することです。

編集

ギリシャ語の記号表記は関係代数をAPLエンジンにプログラムする方法であり、Dateの構文は関係代数をCOBOLまたはPL / 1のようなエンジンにプログラムする方法であると想像できます(このようなエンジンは事実上存在します) Rel)と呼ばれ、関係代数をOOのようなエンジンにプログラムする方法は、relation.NaturalJoin(otherRelation).Matching(yetOtherRelation.Restrict(condition).project(attributesList))のようになります。

于 2011-11-01T16:14:43.123 に答える