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:
Version imprimable
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:SELECT 4/2 FROM DUAL;
Devrais te retourner 2 (4 divisé par 2)Code:SELECT DIV(4,2) FROM DUAL;
Devrait te retourner 0 (le reste de la division de 4 par 2)Code:SELECT MOD(4,2) FROM DUAL;
Je crois que ma question était mal posée !!! :oops:
En fait, je parle de la division d'une table sur une autre table
et non pas de la division de deux nombres.Citation:
ex: Table_C = Table_A / Table_B
A titre d'exemple, si on dévise la table A
par la Table BCode:
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:
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 laCode:
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 !
:cry:
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:
1
2
3 SELECT ncmd FROM A GROUP BY ncmd Having Count(np) IN (SELECT count(np) FROM B);
:D :lahola: :D
ç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.:roll:
:P Merci encore :P
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 :-)Citation:
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 :wink: )
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é :D
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:
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 :wink:
[/EDIT]
trop tard :lol:
Et moi aussi vous m'avez grillé avant mon edit avec un supérieur à la place du IN :D
Je ne vois pas en quoi le "supérieur" fonctionne ?
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 +