Division relationnelle, petites précisions…

Dans un article sur la division relationnelle, un internaute m’a fait remarqué une erreur. En fait il y en avait deux et une petite imprécision…

Il y a une première erreur dans la solution au § 4

La bonne requête est :

SELECT DISTINCT VILLE_ETP
FROM T_ENTREPOT
WHERE RAYON_RYN IN
  (SELECT RAYON_RYN
   FROM T_ENTREPOT
   WHERE  RAYON_RYN NOT IN
     (SELECT RAYON_RYN
      FROM T_ENTREPOT
      WHERE RAYON_RYN NOT IN
         (SELECT RAYON_RYN
          FROM T_RAYON)))
GROUP BY VILLE_ETP
HAVING COUNT (DISTINCT RAYON_RYN) =  
  (SELECT COUNT(DISTINCT RAYON_RYN)
   FROM T_RAYON)

Dans le premier COUNT, il faut mettre « DISTINCT RAYON_RYN » au lieu de l’étoile.

Pour la requête du § 6, la bonne requête est :

SELECT DISTINCT VILLE_ETP
FROM T_ENTREPOT AS ETP1
WHERE
NOT EXISTS(SELECT RAYON_RYN
FROM T_RAYON
EXCEPT
SELECT RAYON_RYN
FROM T_ENTREPOT AS ETP2
WHERE ETP1.VILLE_ETP = ETP2.VILLE_ETP
)
Même si en théorie l’absence du NOT EXISTS avec l’évaluation à NULL du prédicat est possible, l’expression est peu jolie. Mais c’est sur l’opérateur ensembliste que porte l’erreur. Il faut utiliser EXCEPT et non INTERSECT !

La § 7 donne une solution sans reste (division exacte)

Merci à aieeeuuuuu (quel drôle de nom… Il a dû se coincer les doigts dans le SQL quand il était petit) de m’avoir signaler cela !


--------
Frédéric Brouard, SQLpro - ARCHITECTE DE DONNÉES, http://sqlpro.developpez.com/
Expert bases de données relationnelles et langage SQL. MVP Microsoft SQL Server
www.sqlspot.com : modélisation, conseil, audit, optimisation, tuning, formation
* * * * *  Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence  * * * * *

MVP Microsoft SQL Server

Laisser un commentaire