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 :
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 * * * * *