La réponse dépend des opérateurs que votre algèbre comprend. Un opérateur de semi-jointure serait très utile ici.
Si l'attribut commun était nommé number
dans les deux relations, il s'agirait d'une semi-jointure suivie d'une projection de number
. En supposant un opérateur ETM-join nommé MATCHING
, selon Tutorial D:
(collection MATCHING anotherStack) { number }
Comme affiché, l'attribut doit être renommé premier:
(collection MATCHING (anotherStack RENAME { anotherNumber AS number }) { number }
Si Standard SQL (le SQL-92) JOIN
peut être considéré , en gros, un opérateur relationnel alors il est vrai que SQL n'a pas de semi-jointure. Cependant, il a plusieurs prédicats de comparaison qui peuvent être utilisés pour écrire un opérateur de semi-jointure, par ex. MATCH
:
SELECT number
FROM collection
WHERE MATCH (
SELECT *
FROM collection
WHERE collection.number = anotherNumber.anotherStack
);
Cependant, MATCH
n'est pas largement pris en charge dans la vie réelle des produits SQL, donc pourquoi une semi-jointure est généralement écrit en utilisant IN (subquery)
ou EXISTS (subquery)
(et je soupçonne que c'est pourquoi vous nom coché la case « sous-requête » dans votre question à savoir le terme semi-jointure n'est pas bien connu parmi les praticiens SQL).
Une autre approche consisterait à utiliser un opérateur de croisement si disponible.
Quelque chose comme (pseudo-code):
(collection project number)
intersect
((anotherStack rename anotherNumber as number) project number)
Dans SQL:
SELECT number
FROM collection
INTERSECT
SELECT anotherNumber
FROM anotherStack;
Ceci est très bien pris en charge dans la vie réelle (SQL Server, Oracle, PostgreSQL, etc, mais notamment pas MySQL).
Une sous-requête corrélée? Pouvez-vous donner un exemple SQL pour lequel vous voulez l'AR? –
Edité la requête que je voudrais l'AE pour – AnEventHorizon