Soient 2 ensembles A et B, où par analogie avec la notion de Relation (autrement dit une table) du modèle relationnel, les éléments de chacun des 2 ensembles A et B sont représentés par des lignes ; il s’agit tout simplement des lignes de tables.
Rappelons au passage, qu’une Relation, dans la théorie des ensembles, et également dans le modèle relationnel utilisé par les SGBD relationnels comme ORACLE, SQL Server, DB2, etc. n’est autre chose, qu’un sous-ensemble du Produit cartésien de degré n (n-uplet) de n ensembles Dn, où chaque Dn représente l’ensemble dans lequel les données de la colonne Cn de la Relation prennent valeur. Les ensembles Dn sont généralement définis par intention et représentent les types de données des colonnes Cn. Exemple : VARCHAR(10), DATETIME, DECIMAL(18, 6), etc.
Un problème, assez récurrent dans SQL, est le suivant : "Comment exprimer, en SQL, dans une clause WHERE, le fait qu’un ensemble A doit être inclus dans un ensemble B ? Exemple : Tous les Clients doivent être également des Personnes morales, autrement dit, l’ensemble des Clients doit être inclus dans l’ensemble des Personnes morales ?".
La réponse est la suivante :
Un ensemble A est inclus dans un ensemble B, si et seulement si, tout élément x appartenant à A, x appartient à B.
De manière plus formelle : A ⊂ B signifie ∀ x (x ∈ A ⇒ x ∈ B).
Par conséquent l'ensemble A n'est pas inclus dans l'ensemble B, si et seulement si, il existe un élément de A qui n'appartient pas à B.
De manière plus formelle : A ⊄ B, si et seulement si, ∃ x (x ∈ A et ∉ B).
Cette deuxième définition nous incite à utiliser l’opérateur SQL : EXCEPT
L’opérateur EXCEPT combine deux requêtes SELECT et retourne les lignes, distinctes, de la première requête SELECT qui ne sont pas retournées par la deuxième requête SELECT.
A ⊂ B, si et seulement si, A EXCEPT B = ∅ (ensemble vide).
II - Mise en œuvre sous SQL Server
Ci-dessous 2 exemples de mise en œuvre :
Exemple 1 :
A = { 2, 3, 7 }
B = { 4, 2, 7, 3 }
Pour exprimer dans une clause WHERE le fait que l’ensemble A doit être inclus dans l’ensemble B, il suffit de procéder comme indiqué dans l'exemple de la requête SQL ci-dessous :
SELECT 'A est inclus dans B' AS Resultat WHERE NOT EXISTS ( SELECT * FROM ( -- Ensemble A Début... ( select 2 as col1 union all select 3 as col1 union all select 7 as col1 ) -- Ensemble A ...Fin EXCEPT -- Ensemble B Début... ( select 4 as col2 union all select 2 as col2 union all select 7 as col2 union all select 3 as col2 ) -- Ensemble B ...Fin ) Ensemble_A_Except_B )Résultat : (une ligne, c’est-à-dire A est inclus dans B).
Resultat A est inclus dans BExemple 2 :
A = { 2, 3, 7 }
B = { 4, 2, 7, 11 }
Pour exprimer dans une clause WHERE le fait que l’ensemble A doit être inclus dans l’ensemble B, il suffit de procéder comme indiqué dans l'exemple de la requête SQL ci-dessous :
SELECT 'A est inclus dans B' AS Resultat WHERE NOT EXISTS ( SELECT * FROM ( -- Ensemble A Début... ( select 2 as col1 union all select 3 as col1 union all select 7 as col1 ) -- Ensemble A ...Fin EXCEPT -- Ensemble B Début... ( select 4 as col2 union all select 2 as col2 union all select 7 as col2 union all select 11 as col2 ) -- Ensemble B ...Fin ) Ensemble_A_Except_B )Résultat : (aucune ligne , c’est-à-dire A n'est pas inclus dans B).
Resultat
Aucun commentaire:
Enregistrer un commentaire
Remarque : Seul un membre de ce blog est autorisé à enregistrer un commentaire.