Comment est-ce que je représente une sous-requête en relation d'algèbre? Dois-je mettre le nouveau sélection sous la condition de sélection précédente?
3 Réponses :
Vous venez de réécrire cela comme un Je ne sais pas dans quelle mesure la syntaxe que j'ai apprise pour l'algèbre relationnelle est tellement en mots. P>
rejoindre code>. p>
AnneNumber code> à partir de
anotherck code> li>
AnneNumber code> à partir du résultat de l'étape 1 comme
numéro code> li>
Collection CODE> LI>
numéro code> à partir du résultat de l'étape 3 li>
ol>
Un pourrait i> réécrire cela comme une jointure :)
La réponse dépend des opérateurs que votre algèbre comprend. Un opérateur de join demi-join serait le plus utile ici.
Si l'attribut commun a été nommé tel que posté, l'attribut doit être renommé d'abord: p> si SQL standard (SQL -92) Cependant, Une autre approche serait d'utiliser un opérateur d'intersect si disponible. p> quelque chose comme (pseudocode): p> dans SQL: p> C'est assez bien Soutenu dans la vie réelle (SQL Server, Oracle, PostgreSQL, etc. mais notamment MySQL). P> P> numéro code> dans les deux relations, il s'agirait d'une joindre semi-join suivi d'une projection du numéro
>. En supposant qu'un opérateur de join SEM nommé
correspondant code>, selon tutoriel d < / a>: p>
JOIN CODE> peut être considéré, de manière lâche, un opérateur relationnel, alors il est vrai que SQL n'a pas de joint semi-joint. Cependant, plusieurs prédicats de comparaison peuvent être utilisés pour écrire un opérateur de joint semi-joint.
correspondez code>: p>
correspondant code> n'est pas largement pris en charge dans les produits VRAI Life SQL, donc pourquoi une jointure semi-jointure est généralement écrit en utilisant
dans (sous-requête) code> ou
existe (sous-requête) code> (et je soupçonne que c'est la raison de votre coché "sous-requête" dans votre question, c'est-à-dire que le terme semi-join est-il Pas bien connu parmi les pratiquants SQL). P>
Vous devriez être un peu plus précis dans votre choix de mots. Si la correspondance peut être utilisée dans une clause WHERE (dans la manière dont vous avez décrit), alors cet opérateur doit renvoyer un booléen, puis le match ne peut pas être «un opérateur de semijoin», comme vous le demandez. Un opérateur de semijoin retourne une relation.
@Erwinsmout: Vous avez un point. L'utilisation du terme "opérateur relationnel" dans le contexte de SQL n'est jamais strictement correcte. Mais il est vrai que j'ai utilisé le terme opérateur trop lâchement ici. J'ai tenté une réécriture mais s'il vous plaît n'hésitez pas à modifier à votre propre satisfaction.
Si vous voyez à quel point SQL et RA sont graves, c'est vraiment étonnant que SQL puisse toujours prétendre être une mise en œuvre de RA, non? Ce qui m'étonne également, c'est comment il semble que ce qui semble être beaucoup de personnes qui veulent savoir comment réécrire SQL en termes de RA. J'aurais pensé que si SQL est une langue pour la mise en œuvre (/ SOLUTION / ...), RA serait en quelque sorte la langue de la spécification ... et une spécification a généralement la spécification avant que l'on ait la mise en œuvre ... ou a fait Cela me manque d'avoir changé pendant mes 5 années sur Mars?
@Erwinsmout: Peut-être que j'ai commencé cette tendance sur Stackoverflow? :) plus probablement peut-être que les gens lisent le même matériel que moi. Le livre récent de la date de la date SQL et relation relationnelle: comment Pour rédiger un code SQL précis , c'est que l'apprentissage de la part de ses activités devrait aider à écrire mieux SQL. Remarque La date pousse à la fois l'algèbre relationnelle et i> calcul ...
@Erwin Smout: ... Chapitre 10: "SQL était spécifiquement destiné à être différent de l'algèbre et de la calcul ... Cependant, il s'est avéré que certaines caractéristiques de l'algèbre et de la calcul étaient nécessaires après tout ... La situation actuelle est donc que certains aspects de SQL sont "comme une algèbre comme", certains sont "du calibre comme" et certains ne sont ni - avec la plus grande implication que la plupart des requêtes, des contraintes, etc., peut être exprimée en SQL du tout peut en fait être exprimé de différentes manières différentes ».
... même si je ne l'ai pas démarré, je suis d'accord des termes de l'algèbre - notamment "Division" et "Semijoin" - sont souvent enregistrés sur Stackoverflow en ce qui concerne SQL de nos jours, il est donc probablement temps de moi i> arrêter;)
Selon Ce PDF, vous pouvez Convertissez facilement une sous-requête en une expression algébrique relationnelle.
Tout d'abord, vous devez convertir toute la requête du formulaire P>
PI[some-column-from-sub-query]( SIGMA[extra-where-clause-if-needed ^ some-column = some-column-from-sub-query ](RO[T1](R1) x RO[T2](R2) x ... x RO[t1](r1) x RO[t2](r2) x ...) )