web-dev-qa-db-fra.com

Trouvez l'étudiant classé le plus élevé utilisant le calcul relationnel de tuple

Supposons que j'ai une table d'élèves contenant leur identifiant et leur note:

-----------------
| id  |  grade  |
-----------------
|  1  |    83   |
|  2  |    94   |
|  3  |    92   |
|  4  |    78   |

Comment écrivez-vous une formule de calcul relationnelle TUPLE qui fait référence à l'élève avec la plus haute qualité?

Ma tentative:

Penser en termes de SQL, j'écrirais une requête qui fait un produit cartésien de la table avec elle-même, prenez toutes les graduations inférieures à une autre catégorie, puis soustrayez de la table d'origine. Cependant, dans le calcul relationnel du tuple, il n'est pas possible de construire des sous-tableaux dans des sous-requêtes, raison pour laquelle je suis bloqué.

Cependant, j'ai tenté quelque chose dans cette direction:

{ <id> | Ǝ grade1 ∈ students (id, grade) ⋀ Ǝ grade2 ∈ students (id, grade2) ⋀ grade1 > grade2}

Je crois que cela me donnerait des notes inférieures, mais comment puis-je soustraire tout cela de la table originale des étudiants? Je ne suis pas autorisé à insérer cette déclaration dans une autre requête TRC. Merci d'avance pour votre aide!

6
CodyBugstein

Compte tenu du schéma Students(id:integer,grade:integer), vous pouvez résoudre le problème dans le calcul relationnel TUPLE en utilisant l'opérateur de négation (¬).

{T1.id | ∃T1 ∈ Students ¬(∃T2 ∈ Students (T2.grade > T1.grade))}

Cela rendrait l'identifiant de tous les élèves de T1 où il n'y a pas d'étudiant en T2 avec une note supérieure.

Étant donné que T1 et T2 sont provenant de la même relation, cela renvoie efficacement l'ensemble des élèves avec la nuance supérieure.

S'il n'y a pas de cravates pour la nuance supérieure, il retournera un seul identifiant.

On dirait que vous pensais en termes d'algèbre relationnelle plutôt que de calcul relationnel de tuple.

Le calcul relationnel TUPLE n'a pas d'opérateur de différence défini, vous ne pouvez donc pas trouver le maximum en soustrayant tous les non-maximums.

Référence

Le Manuel de solutions pour la troisième édition de Systèmes de gestion de la base de données de Ragu Ramakrishnan et Johannes Gerke m'a aidé à résoudre ce problème.

Question 4.3 vous demande de résoudre certains problèmes en utilisant ce schéma:

Suppliers(sid:integer,sname:string,address:string)
Parts(pid:integer,pname:string,color:string)
Catalog(sid:integer,pid:integer,cost:real)

La question 4.3.11 est similaire à la vôtre.

Trouvez les PID des pièces les plus chères fournies par les fournisseurs nommés Yosemite Sham.

La solution ressemble à ceci:

{T | ∃T1 ∈ Catalog(∃X ∈ Suppliers
(X.sname = 'Yosemite Sham' ∧ X.sid = T1.sid) ∧ ¬(∃S ∈ Suppliers
(S.sname = 'Yosemite Sham' ∧ ∃Z ∈ Catalog
(Z.sid = S.sid ∧ Z.cost > T1.cost))) ∧ T.pid=T1.pid)}

La solution ici est plus compliquée en raison des jointures entre fournisseurs et catalogue, mais l'essence de la solution est la même.

Elide les jointures pour obtenir ceci:

T1 ∈ Catalog ...
(... ¬(... ∃Z ∈ Catalog
(... Z.cost > T1.cost)))

Dans la solution de référence, la variable libre T a le même PID que la variable liée T1.

Prendre le PID de T1 directement est un moyen plus simple d'obtenir le même résultat.

10