1

私はインタビューでこの質問に出くわし、私がしたことが正しいかどうか疑問に思っていました. 次の属性を持つテーブル「A」があるとします。

R   S    T
-----------
a1  b1   c1
a1  b2   c2
a1  b3   c3
a4  b4   c4

そして、与えられた B = {[(projection)R,S (A) NATURAL JOIN (projection) S,T (A) ] NATURAL JOIN (projection)R,T (A)} の関係代数を計算する必要があるとしましょう。

結果はどうなりますか?

これは私が試したものです:

-We know (A) NATURAL JOIN (A) = A
-I did the first set of join within the square bracket. Since we had  attribute 'S' in common I just yielded the result to be a table of (R S T) with the same 4 rows of tuples.
-Finally, I joined (R S T) with the second set of join where attributes 'R' and 'T' are common which I assumed will yield R S T again with 4 rows of tuples.

つまり、私のやり方では、B = A になってしまいました。

タプルはまったく考慮しませんでした。2 つのプロジェクション間の共通の属性に基づいて自然な結合を行っただけです。

私はそれが非常にばかげていることを知っています..しかし、私はMySQLでそれを実行しようとしています.そのようなクエリを実行しようとすると、何らかの理由でエラーが発生します:

r1 NATURAL JOIN として dbt2.relationalalgebra から A、B を選択します (r2 として dbt2.relationalalgebra から B、C を選択します)。そして、すべての派生テーブルには独自のエイリアスが必要であるというエラーが表示されます!

自然結合が同じテーブルでどのように機能するかを明確にしてください。

助けてくれてありがとう。

4

2 に答える 2

0

自然結合は、同じ名前を持つすべての列で 2 つのテーブル (またはサブクエリ) を結合するための簡略表現です。

テーブルをそれ自体に自然結合すると、いくつかの結果が生じる可能性があります。最も一般的なのは、テーブル自体です。どの値も NULL ではなく、行が一意である場合です。各行のいずれNULLかの列に値がある場合、 は行natural joinをまったく返しません。行が重複している場合、複数の行が表示されることがあります。

を使用することはお勧めしませんnatural join。基になるテーブル構造を少し変更すると、クエリが壊れる可能性があります。

于 2015-03-21T03:02:08.570 に答える
0

あなたがしたことは正しいです。そして、B = A を得たのは正しいです -- A の内容を考えると。

これは、データ内の値間の関数の依存関係に関する質問です。(したがって、データが異なる場合、B = A とならない可能性があります。)

属性 S と T については、各タプルに異なる値があります。S (または T) の値を指定すると、それがどの行からのものかがわかるため、そのタプルの他の 2 つの属性の値がわかります。関数の依存関係は S -> R、T です。T -> R, S. (S または T はそれぞれ A のキーであると言うかもしれません)。

指定したプロジェクションの属性のペアには、それぞれ少なくとも 1 つのキーが含まれているため、結合される「欠落している」属性を一意に決定します。ヒースの定理によると、損失のない結合分解が見られます。http://en.wikipedia.org/wiki/Functional_dependency

于 2015-04-09T10:10:04.070 に答える