PDA

Voir la version complète : Question SQL



LaVaBo
05/10/2010, 14h57
Salut,

Je suis confronté à un comportement que je n'arrive pas à expliquer, mais faut dire que je suis assez mauvais en SQL :

Cette requête fonctionne nickel :

select distinct XINC_ID as INC_ID

from a, b, c, d, e

where b.XINC_INC_OID = a.INC_OID
and b.XINC_COD_OID000007 = c.COD_OID
and c.COD_OID = d.CDL_COD_OID
and d.CDL_NAME = 'string1'
and e.RCT_RCD_OID = a.INC_STATE_OID
and e.RCT_NAME = 'string2';

La requête suivante, par contre, me renvoie des résultats avec e.RCT_NAME = string2, mais je ne comprend pas pourquoi (tout est identique, sauf la ligne en rouge) :

select distinct XINC_ID as INC_ID

from a, b, c, d, e

where b.XINC_INC_OID = a.INC_OID
and b.XINC_COD_OID000007 = c.COD_OID
and c.COD_OID = d.CDL_COD_OID
and d.CDL_NAME = 'string1'
and e.RCT_RCD_OID = a.INC_STATE_OID
and e.RCT_NAME <> 'string2';SVP, me parlez pas d'optimisation, même si le code est sale, je sais plus utiliser les jointures, et pour un truc ponctuel comme ça qui ne tournera qu'une fois, j'en ai pas besoin. A moins que ça ne soit lié à mon problème ?

Merci d'avance.

JudaGrumme
05/10/2010, 15h13
C'est quel SQL que tu utilises exactement ?

Ca fait quelques temps que j'en ai pas fait, mais tu peux tester


and e.RCT_NAME != 'string2';
ou

and e.RCT_NAME NOT LIKE 'string2';

Pour commencer.

Edit : Ça te renverrai pas des résultats dont e.RCT_NAME contient string2 des fois ?

LaVaBo
05/10/2010, 15h58
C'est quel SQL que tu utilises exactement ?

Ca fait quelques temps que j'en ai pas fait, mais tu peux tester


and e.RCT_NAME != 'string2';ou

and e.RCT_NAME NOT LIKE 'string2';Pour commencer.

Edit : Ça te renverrai pas des résultats dont e.RCT_NAME contient string2 des fois ?
Je vais tester NOT LIKE.
!= je ne crois pas que ça soit reconnu.

Le nom est soit exactement string2, soit totalement différent, il n'y a pas de chaîne qui contienne string2.

La BDD est oracle 9 ou 10, je ne sais pas si c'est ça que tu entends par 'quel type de SQL'.
J'utilise Oracle SQL Developer pour tester les requêtes.

JudaGrumme
05/10/2010, 16h02
Ya plusieurs syntaxes pour SQL suivant la version, tu as répondu à ma question.
Pour le reste je pourrais pas trop t'aider, jamais fait d'Oracle :/

Edit : Selon ce cours (ftp://ftp-developpez.com/oracle/guide/SQL.pdf) que je viens de dégoter, ta commande devrait fonctionner... :tired:

MetalDestroyer
05/10/2010, 16h11
J'aurai plutôt fait:


and e.RCT_NAME NOT LIKE '*string2*';

On ne sait jamais si ta valeur contient des espaces en trop qui se sont incrusté avant ou en fin de chaîne voir les deux. Et la meilleur solution étant de faire un trim pour virer les espaces, au moins, y a pas d'ambiguité. Et tu devrais pouvoir faire directement ton and e.RCT_NAME NOT LIKE 'string2'; ou and e.RCT_NAME <> 'string2';

JudaGrumme
05/10/2010, 16h23
Ce serait pas

and e.RCT_NAME NOT LIKE '%string2%';
Plutôt ? :unsure:

MetalDestroyer
05/10/2010, 16h44
Ce serait pas

and e.RCT_NAME NOT LIKE '%string2%';
Plutôt ? :unsure:

En effet. Je confonds avec le moteur de recherche de Windows. :O

ylyad
05/10/2010, 17h34
Avec les jointures, ça devrait donner:

SELECT distinct XINC_ID as INC_ID

FROM a INNER JOIN b
ON b.XINC_INC_OID = a.INC_OID
INNER JOIN c
ON b.XINC_COD_OID000007 = c.COD_OID
INNER JOIN d
ON c.COD_OID = d.CDL_COD_OID
INNER JOIN e
ON e.RCT_RCD_OID = a.INC_STATE_OID

WHERE d. CDL_NAME = 'string1'
AND
e.RCT_NAME <> 'string2';


Mais effectivement, ta requête devrait marcher. Essaie comme ça... Essaie de rajouter le champe e.RCT_NAME dans le SELECT, juste pour voir