3

テーブル:

Show(show_id, title, start_date, duration,singer,hall_id)
Concert(concert_is,date,hour,show_id)
Hall(Hall_id, name, address, capacity)

上記は3つのテーブルのDBです。いくつかの単純なSQLステートメントをRAに変換する必要があります。

SELECT date
FROM Concert C, Show S, Hall H
WHERE C.show_id = S.Show_id
AND S.hall_id = H.hall_id
AND S.singer = 'A'
AND H.name = 'B'

RAの場合:

pi date (s(show_id = show_id)Show |><| Concert)

上記は完全ではありません、私はちょうど私が正しい軌道に乗っているかどうかを知る必要があります。RAに関する情報は限られています。

4

2 に答える 2

1

「NATURALJOIN」を使って一発。また、タプル変数を使用しなかったことにも注意してください。

pi date (sigma name = 'B' AND singer = 'A' (CONCERT x SHOW x HALL))

上記の式は、SQLクエリを評価する上で最も効率の悪い方法の1つです。ただし、構文的にはSQLに厳密に従います。

使用したクエリテンプレートは次のとおりです。

pi TargetList sigmaSelection_Condition (REL1 x ... X RELn)

あなたの|><|を使用するもう1つのバリアントですぐに更新します 演算子、必要に応じて...

于 2012-08-16T16:23:56.687 に答える
1

最初のステップは、クエリを単語に変換することです。何が求められているのでしょうか。この場合、コンサートでのショーが「A」によって歌われ、コンサートがあったホールが「B」と名付けられたすべてのコンサートの日付が必要です。(この手順は必ずしも必要ではありません。多くの場合、SQLから直接RAを生成できますが、何をしているのかを確実に理解することは決して悪い考えではありません)。

それでは、RAステートメントを裏返しに作成しましょう。まず、ショーとコンサートを同時に見るときはいつでも、そのコンサートでのショーのみを探していることを確認したいと思います。この場合、ショーのIDはコンサートのフィールドです。だからあなたの直感を使うnatural join/|><|正しい。特に指定がない限り、自然結合はすべての同等の列名に自動的に一致することを常に学びました(ただし、最初に教師の標準を確認します)。したがって、この場合、表示される結合条件を指定する必要はありません。 IDの一致。たとえそうだとしても、それは結合の添え字であり、selectステートメントの一部ではありません。次に、ホールとショーを見るときは、そのホールのショーだけを見るようにします。したがって、ホールに自然に参加して前の結果にしたいと思います(参加の順序が重要であることに注意してください。コンサートやホールにまだ参加していない場合は、自然に参加することはできません)。

次のステップは、必要な情報の行のみを取得することです。この場合、select/sigmaステートメントは非常に簡単です。名前とホールを希望どおりに指定するだけです。最後に、project/pi取得した行から必要なデータ要素のみを取得します。この場合、日付のみを投影します。その後、完了です。これまでのRAから、すべての演算子が正しい順序で既に存在していることがわかります。オペランドが欠落しているだけです。

他にも考慮すべきことがいくつかあることに注意してください。rename/rho書き出すのを簡単にするために、各テーブルでの使用を検討することをお勧めします。さらに、RAでSQLを正確に複製する必要がある場合は、renameを使用し、自然結合をで置き換えてcross join/X、selectステートメントに結合条件を配置する必要があります。

于 2012-09-23T17:26:14.790 に答える