SQL Server - Comment exprimer dans une clause WHERE qu'un ensemble A est inclus dans un ensemble B ?

I - Prolégomènes
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 B
Exemple 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.