En SQL il n'existe pas d'equivalent direct à la division qu'on
trouve en Algèbre relationnelle.
Comment peut on alors effectuer une division en SQL ?
:pingoin:
En SQL il n'existe pas d'equivalent direct à la division qu'on
trouve en Algèbre relationnelle.
Comment peut on alors effectuer une division en SQL ?
:pingoin:
Si je ne m'abuse, c'est DIV qui fait office de division... MOD te donne le reste, et / fonctionne aussi, je crois.
Hélas, je n'ai pas les moyens de tester ici, mais essaie ces quelques exemples (pour oracle, mais tu peux les adapter à ton SGBDR):
Devrais te retourner 2 (4 divisé par 2)
Code : Sélectionner tout - Visualiser dans une fenêtre à part SELECT 4/2 FROM DUAL;
Devrais te retourner 2 (4 divisé par 2)
Code : Sélectionner tout - Visualiser dans une fenêtre à part SELECT DIV(4,2) FROM DUAL;
Devrait te retourner 0 (le reste de la division de 4 par 2)
Code : Sélectionner tout - Visualiser dans une fenêtre à part SELECT MOD(4,2) FROM DUAL;
Je crois que ma question était mal posée !!!![]()
En fait, je parle de la division d'une table sur une autre table
et non pas de la division de deux nombres.ex: Table_C = Table_A / Table_B
A titre d'exemple, si on dévise la table A
par la Table B
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 NCmd NP C001 P001 C002 P007 C003 P001 C004 P001 C004 P002 C004 P003 C004 P004 C004 P005 C004 P006 C004 P007 C004 P008
ça va nous donner la table C :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 NP P001 P002 P003 P004 P005 P006 P007 P008
Et ceci car C004 (commande 4) contient tout les élements de la
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 NCmd C004
table B(table des produits).
La division dans l'algèbre relationnelle est indispensable dans des requêtes tel que:
"Trouvez les commandes contenant tout les produits "
(comme ds l'exemple que j'ai donné)
ou encore "Trouvez les clients qui ont vu tout les filmes."
Et c'est cela que je n'ai pas pu effectuer, car je n'est pas trouvé d'equivalent en SQL !
![]()
Je sais pas si division est vraiment le terme adéquat...
Par contre une jointure avec un GROUP BY et un HAVING COUNT me parrait plus correct.
Je ne sais pas si ma requete marche mais tu as l'idée générale.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 SELECT ncmd FROM A GROUP BY ncmd Having Count(np) IN (SELECT count(np) FROM B);
![]()
![]()
![]()
ça marche !!!
MERCI beaucoup Gaël Donat.
Pour le nom, en algèbre relatinnelle on l'appelle Division ça j'en suis sûr,pour le SQL je ne sais pas.![]()
Merci encore
![]()
Bonjour, j'aurais 2 critiques à faire (critique dans le sens positif du terme bien sûr :-) )
1. le count ici ne retourne qu'un élément donc tu peux mettre un =, mais c'est vraiment un détail :-)SELECT ncmd FROM A
GROUP BY ncmd Having Count(np) IN (SELECT count(np) FROM B);
2. En fait, ce n'est pas vraiment l'équivalent d'une division puisque tu comptes les éléments. Si tu as des doublons dans ta table, ca risque de ne pas marcher (en même temps, suffirait de mettre un supérieur à la place du IN)
Donc, je suis aussi à la recherche d'une autre solution, même si la solution donnée me satisfait dans mon cas, mais c'est par curiosité![]()
count( DISTINCT lacolonne) fonctionne il me semble![]()
Le deuxième distinct est souvent inutile, la table B étant généralement une table de référence.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 SELECT ncmd FROM A GROUP BY ncmd HAVING COUNT(DISTINCT np) = (SELECT COUNT(DISTINCT np) FROM B)
[EDIT]
Orafrance tu m'as grillé de moins d'une minute![]()
[/EDIT]
Et moi aussi vous m'avez grillé avant mon edit avec un supérieur à la place du IN![]()
Vos solution ne sont qu'une partie infime de la solution générale de la division relationnelle et ne marche qua dans des cas bien particuliers.
Voici la solution générale : http://sqlpro.developpez.com/cours/divrelationnelle/
A +
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
* * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *
Partager