probleme de selection selon critere

probleme de selection selon critere - SQL/NoSQL - Programmation

Marsh Posté le 20-07-2006 à 12:40:17    

Bonjour,
 
j'ai un petit soucis pour batir une requete, voila le topo :
 

art  | nom
----------
XX   | a
XX   | b
XX   | c
YY   | t
YY   | u


 
J'ai mon article XX qui est composé de a,b et c. Mon YY de t et u.
 
Ensuite j'ai la table de reception des composants suivantes :

nom | prix
----------
a   | 50
c   | 34
t   | 12
u   | 15


 
En fait je voudrais faire une requete qui me selectionne les articles dont j'ai eut une reception pour chacun des composants. Dans mon exemple la requete renvoie YY car tous ses composants ont un prix mais pas XX car il manque le prix de b.
 
Merci d'avance.
 
:hello:


Message édité par $man le 20-07-2006 à 12:41:33
Reply

Marsh Posté le 20-07-2006 à 12:40:17   

Reply

Marsh Posté le 20-07-2006 à 13:53:50    

a essayer, j'ai pas pu tester :
 

Code :
  1. select distinct a.art
  2. from articles a
  3. where a.art not in (select distinct recap.art
  4.              from
  5.           (select a.art, a.nom, r.nom
  6.              from articles a,
  7.              reception r
  8.            where a.nom = r.nom(+)) recap
  9.             where recap.nom is null)


 
ya surement moyen de faire plus joli mais c'est ce que j'ai trouvé en preum's


Message édité par moonboot le 20-07-2006 à 13:54:26
Reply

Marsh Posté le 24-07-2006 à 09:13:14    

Salut,
 
merci de ta réponse, que signifie le r.nom(+) ?
 
:hello:

Reply

Marsh Posté le 24-07-2006 à 09:29:09    

jointure ouverte (si pas de ligne, ça rammène une ligne avec "null" )

Reply

Marsh Posté le 24-07-2006 à 09:32:36    

moi je penserais plutôt à :
 

select t1.art, sum(1), sum(decode(t2.nom, null, 0, 1))
from t2, t1
where t2.nom(+) = t1.nom
having sum(1), sum(decode(t2.nom, null, 0, 1))


 
à vérifier aussi, mais ça devrait marcher, etun peu plus performant que la requête de moonboot


Message édité par Arjuna le 24-07-2006 à 09:33:02
Reply

Marsh Posté le 24-07-2006 à 10:00:27    

Salut,
 
ok, c'est comme un right outer join alors ?
 
Merci.

Reply

Marsh Posté le 24-07-2006 à 10:06:44    

oui

Reply

Marsh Posté le 24-07-2006 à 10:08:27    

la syntaxe (+) à côté d'un champ, c'est la syntaxe Oracle. Elle indique que c'est du côté du champ qu'il faut ajouter les lignes vides si la jointure ne se fait pas.
 
La syntaxe *= ou =*, c'est la syntaxe SQL Server. Elle indique qu'il y a plus de lignes du côte de l'étoile, c'est donc l'inverse d'Oracle (juste pour faire chier :D)

Reply

Marsh Posté le 24-07-2006 à 10:10:06    

Merci,
 
je vais me pencher sur le probleme, et je suis en SQL SRV donc decode il connait pas :)
 
:hello:

Reply

Marsh Posté le 24-07-2006 à 10:11:56    

utilise "case when" à la place un peu plus lourd... ou un if vu qu'on n'a que deux choix


Message édité par Arjuna le 24-07-2006 à 10:13:42
Reply

Marsh Posté le 24-07-2006 à 10:11:56   

Reply

Marsh Posté le 24-07-2006 à 10:13:16    

Ca devrait donner un truc du style :
 


select t1.art, sum(1), sum(if t2.nom is null then 0 else 1 end if))  
from t2, t1  
where t2.nom =* t1.nom  
having sum(1), sum(decode(t2.nom, null, 0, 1))

Reply

Marsh Posté le 24-07-2006 à 10:32:56    

pas mal ton truc arjuna, connaissais pas cette astuce avec le sum(1), je vais tester chez moi, ca pourrait me servir !

Reply

Marsh Posté le 24-07-2006 à 10:43:15    

moonboot a écrit :

pas mal ton truc arjuna, connaissais pas cette astuce avec le sum(1), je vais tester chez moi, ca pourrait me servir !


j'espère que ça marche, je n'ai pas testé ;) mais dans l'approche ça doit être ok. j'ai juste un doute avec le having, j'arrive jamais à le faire marcher du premier coup ;)

Reply

Marsh Posté le 24-07-2006 à 10:44:26    

sinon, à la place du SUM() on peut essayer avec un COUNT() sans mettre le IF à l'intérieur. Si c'est bien foutu, il devrait rejeter les NULL, mais je suis très loin d'être sûr de moi sur ce coup ;)

Reply

Marsh Posté le 24-07-2006 à 14:48:56    

= plutôt que , dans le having ce serait mieux je pense :ange:

Reply

Marsh Posté le 24-07-2006 à 15:57:47    

ah ouais, copier coller malencontreux :D

Reply

Marsh Posté le 24-07-2006 à 15:58:05    

Salut,
 
Y'a des chances en effet.  
 
J'ai refais par moi meme la requete précédente , avec des JOIN, je suis plus familier avec.  
J'arrive à un résultat très similaire à ce qu'a indiqué moonboot, c'est plutôt bon signe.  
En combinant ce dernier poste avec mes précédents, je pense avoir réussi à faire mon truc.
Je vous remercie, c'est clairement grâce à votre aide :)
C'est la plus grosse requete que j'ai jamais fait pour l'instant :love: (:D) et ca me facilite bien la vie.
 
Merci :hello:


Message édité par $man le 24-07-2006 à 15:58:36
Reply

Marsh Posté le 24-07-2006 à 16:00:38    

tu verras quand tu feras des requêtes de 200 lignes, tu regretteras cette époque où tes problèmes étaient aussi simple que ça :D

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed