[SQL] Fonctionnement des sous-requêtes

Fonctionnement des sous-requêtes [SQL] - SQL/NoSQL - Programmation

Marsh Posté le 21-06-2007 à 18:09:45    

Bonjour tout le monde !
 
Voilà, je me pose de sérieuses questions sur le fonctionnement des sous-requêtes !!! En effet, voici ma requête (inutile de la comprendre, juste la syntaxe) :
 

Code :
  1. SELECT idMag, idAffilie, Ville, Adresse
  2. FROM MagParAffilie
  3. WHERE Email = (SELECT email FROM abonnes WHERE codeuser = 'jerome')
  4. AND idMag <> 05114
  5. AND idMag NOT IN (
  6.      SELECT DISTINCT idMag FROM cmd_contenu WHERE idCommande IN (SELECT DISTINCT idCommande FROM cmd_Commande WHERE Date >= NOW()))


 
Quand je laisse ma requête tel quel elle ne retourne pas le résultat escompté, mais quand je remplace ma seconde sous-requete par son résultat ça fonctionne, et c'est là que je ne comprends pas !!
 
Je reformule, le résultat de ma seconde sous-requete est : 05111

Code :
  1. SELECT DISTINCT idMag FROM cmd_contenu WHERE idCommande IN (SELECT DISTINCT idCommande FROM cmd_Commande WHERE Date >= NOW()) => donne 05111


 
Quand je la remplace par sa valeur donc :
 

Code :
  1. SELECT idMag, idAffilie, Ville, Adresse
  2. FROM MagParAffilie
  3. WHERE Email = (SELECT email FROM abonnes WHERE codeuser = 'jerome')
  4. AND idMag <> 05114
  5. AND idMag NOT IN (05111)


 
Et là je ne comprends pas car elle me retourne le résultat escompté...
 
Si quelqu'un peut m'éclairer car franchement je vois pas très très bien la différence...
 
Merci d'avance

Reply

Marsh Posté le 21-06-2007 à 18:09:45   

Reply

Marsh Posté le 21-06-2007 à 19:47:16    

Avant d'aller plus loin, aprends à faire des jointures.
 
L'ensemble de tes sous-requêtes est 100% transcriptible avec des jointures.
 
Surtout la première :o


Message édité par MagicBuzz le 21-06-2007 à 19:47:29
Reply

Marsh Posté le 21-06-2007 à 22:23:38    

utilise les clès étrangers pour lier ta table avec les étranges (pour faire des jointures)
tu iras plus vite que avec des sous requetes

Reply

Marsh Posté le 22-06-2007 à 09:39:21    

tu es sur que ton idMag est du numérique partout?
 
parceque la je dirais que dans MagParAffilie il est en numérique
et dans cmd_contenu il serait en caractère

Reply

Marsh Posté le 22-06-2007 à 10:28:50    

idMag de la table MagParAffilie est en varchar(9) et en varchar(11) dans la table cmd_contenu... vous allez me prendre pour un fou mais la requête mise plus haut marche sans les guillements... Le SGBD est MySql
 
Sinon, voici (à la demande générale) la première requête évoquée avec des jointures :
 

Code :
  1. SELECT M.idMag, idAffilie, Ville, Adresse
  2. FROM MagParAffilie M, cmd_contenu Co, cmd_Commande C, abonnes A
  3. WHERE M.idMag = Co.idMag
  4. AND M.Email = A.email
  5. AND Co.idCommande = C.idCommande
  6. AND M.idMag <> 05114
  7. AND M.idMag NOT IN (
  8. SELECT DISTINCT idMag FROM cmd_contenu WHERE idCommande IN (SELECT DISTINCT idCommande FROM cmd_Commande WHERE Date >= NOW()))


 
Bon par contre j'ai pas réussi à changer l'instruction de mon dernier AND... et là maintenant je n'ai plus de "data retourned"


Message édité par soad029 le 22-06-2007 à 10:30:14
Reply

Marsh Posté le 22-06-2007 à 11:12:27    

sans les guillements, je me demande si le sgbd essaye pas de caster ton nombre (peut-être interprété comme un octal à cause du 0 devant) en chaîne...:/ ca me paraît assez risqué comme truc en tout cas.

Reply

Marsh Posté le 22-06-2007 à 11:42:50    

risqué ? De ne pas mettre les guillemets ? Car en faite on s'en fou des guillemets car la requête qui ne marche pas est la toute première et il n'y a pas de guillemets à mettre ou à ne pas mettre (sauf pour M.idMag<>05114) mais bon.. Cette instruction n'est pas importante

Reply

Marsh Posté le 22-06-2007 à 11:45:34    

soad029 a écrit :

risqué ? De ne pas mettre les guillemets ? Car en faite on s'en fou des guillemets car la requête qui ne marche pas est la toute première et il n'y a pas de guillemets à mettre ou à ne pas mettre (sauf pour M.idMag<>05114) mais bon.. Cette instruction n'est pas importante


 
je parlais, bien entendu, de mettre de guillements autour des valeurs 05114 et 05111 que tu compares à idMag qui est un varchar...

Reply

Marsh Posté le 22-06-2007 à 11:47:56    

idmag contient "05111" ou "5111" ?
 
parceque si d'un côté t'as 05111 et de l'autre 5111, ça ne peux pas marcher.
 
hors, le "not in (05111)", si effectivement idmag contient 5111 ça va marcher, puisque le 0 va disparaître vu que c'est un nombre.
 
bref, ça me semble particulièrement bancal...
=> nombre en varchar
=> clé étrangère d'un type différent de l'identifiant
 
 [:atari]

Reply

Marsh Posté le 22-06-2007 à 12:42:15    

idMag contient 05111 et les deux idMag ont exactement la même valeur.
 
Non, ce n'est pas bancal, bien entendu que les nombres sont en varchar, tant qu'on ne fait pas d'opération sur ces données il faut les mettres en varchar (comme les identifiants, les code postaux, les numéros de téléphones...) sinon le '0' ne passe pas.
 
Sinon je ne vois pas ou la clé étrangère est d'un type différent de l'identifiant, tout est en varchar.
 

Reply

Marsh Posté le 22-06-2007 à 12:42:15   

Reply

Marsh Posté le 22-06-2007 à 13:49:28    

y'a juste la longueur qui est différente mais bon

Reply

Marsh Posté le 22-06-2007 à 14:17:12    

oui voilà, la longeur est différente mais ça ne va pas géner l'égalité lors du test de la jointure, tant que les deux données comparées sont du même type c'est bon, la taille n'a rien à voir la dedans.

Reply

Marsh Posté le 22-06-2007 à 14:38:34    

si elles sont pas de la même longueur, c'est qu'elles sont pas du même type :o

Reply

Marsh Posté le 23-06-2007 à 10:11:09    

en tout cas moi en oracle je m'attendrais tres clairement a ce que
 

Code :
  1. SELECT idMag, idAffilie, Ville, Adresse
  2. FROM MagParAffilie
  3. WHERE Email = (SELECT email FROM abonnes WHERE codeuser = 'jerome')
  4. AND idMag <> 05114
  5. AND idMag NOT IN (05111)


 
me renvoie un idMag <> de '5111'

Reply

Sujets relatifs:

Leave a Replay

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