データベースを扱う場合、リレーショナル代数を使用して MAX を見つけるにはどうすればよいですか?
8 に答える
単一の属性 'a' を持つ関係 A があると仮定します (より複雑な関係をこれに還元することは、関係代数では単純な作業です。ここまで来ていると確信しています)。 A の値。
それを行う 1 つの方法は、A とそれ自体の外積を見つけることです。必ず「a」の名前を変更して、新しいリレーションが異なる名前の属性を持つようにしてください。例えば:
('a' を 'a1' にリネーム) X ('a' を 'a2' にリネーム)
'a1' < 'a2' を選択すると、結果のリレーションには最大値を除くすべての値が含まれます。最大値を取得するには、元の関係の違いを見つけるだけです。
(A x A) - (select 'a1' < 'a2') ((rename 'a' as 'a1')(A) x (rename 'a' as 'a2')(A))
次にproject
、Tobi Lehman が下のコメントで提案しているように、演算子を使用して 1 つの列に減らします。
これを関係代数表記で書くと(私の記憶が正しければ)、最終的な名前変更 (すなわち ρ) は、元のリレーションと同じ名前を持つ属性で終了するだけであることに注意してください。
ρ a/a1 (π a1 ((A x A) - σ a1 < a2 (ρ a1/a (A) x ρ a2/a (A))))
今日これを自分で解決しようとしていたので、2セントだけです。
A = 1,2,3 があるとしましょう
使用する場合
A x A - (select 'a1' < 'a2') ((rename 'a' as 'a1')(A) x (rename 'a' as 'a2')(A))
1|1、2|1,3|2,3|1,3|2,3|3 のような 2 つの列ではなく、単一の最大値を取得することはありません。
ちょうど3を取得する方法は
project(a)A - project(a1)((select 'a1' < 'a2') ((rename 'a' as 'a1')(A) x (rename 'a' as 'a2')(A)))
少なくとも、それは私が同様の状況でしなければならなかったことです。
それが誰かを助けることを願っています
属性 A と値 1,2,3 の関係があるとします。
A
1
2
3
だから今..
A値をプロジェクトし、A1で名前を変更します
A1
1
2
3
再び A 値を投影し、A2 で名前を変更します
A2
1
2
3
A2<A1
これをieで結合し\join_{A2<A1}
ます - 出力スキーマ: (A2 整数、A1 整数)
A2<A1
1|2
1|3
2|3
私たちはそれが好きなので、常にA2値はA1よりも小さいと聞きますjoin
( a2<a1
)
プロジェクトA2の出力は次のようになります
A2
1
2
元の属性と比較するようになりました
A diff A2
A
1
2
3
diff
A2
1
2
出力は3
最大値
私は今、関係代数の構文のほとんどを忘れてしまいました。SELECT
、PROJECT
、MINUS
およびのみを使用するクエリは次のRENAME
ようになります。
SELECT v1.number
FROM values v1
MINUS
SELECT v1.number
FROM values v1 JOIN values v2 ON v2.number > v1.number
うまく翻訳できますように!
私はこれが古いことを知っていますが、ここに便利な手書きの式があります!
関係 A: 1,2,3,4
1. First we want to PROJECT and RENAME relation A
2. We then to a THETA JOIN with the test a1<a2
3. We then PROJECT the result of the relation to give us a single set of values
a1: 1,2,3 (not max value since a1<a2)
4. We then apply the difference operator with the original relation so:
1,2,3,4 --- 1,2,3 returns 4
4 is the Max value.