Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
768 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [SQL] Fonctionnement des sous-requêtes

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[SQL] Fonctionnement des sous-requêtes

n°1577757
soad029
Posté le 21-06-2007 à 18:09:45  profilanswer
 

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

mood
Publicité
Posté le 21-06-2007 à 18:09:45  profilanswer
 

n°1577781
MagicBuzz
Posté le 21-06-2007 à 19:47:16  profilanswer
 

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
n°1577813
ghizlane3
Posté le 21-06-2007 à 22:23:38  profilanswer
 

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

n°1577881
casimimir
Posté le 22-06-2007 à 09:39:21  profilanswer
 

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

n°1577912
soad029
Posté le 22-06-2007 à 10:28:50  profilanswer
 

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
n°1577936
rufo
Pas me confondre avec Lycos!
Posté le 22-06-2007 à 11:12:27  profilanswer
 

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.

n°1577953
soad029
Posté le 22-06-2007 à 11:42:50  profilanswer
 

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

n°1577956
rufo
Pas me confondre avec Lycos!
Posté le 22-06-2007 à 11:45:34  profilanswer
 

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...

n°1577958
MagicBuzz
Posté le 22-06-2007 à 11:47:56  profilanswer
 

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]

n°1577981
soad029
Posté le 22-06-2007 à 12:42:15  profilanswer
 

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.
 

mood
Publicité
Posté le 22-06-2007 à 12:42:15  profilanswer
 

n°1578007
MagicBuzz
Posté le 22-06-2007 à 13:49:28  profilanswer
 

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

n°1578020
soad029
Posté le 22-06-2007 à 14:17:12  profilanswer
 

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.

n°1578034
MagicBuzz
Posté le 22-06-2007 à 14:38:34  profilanswer
 

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

n°1578308
casimimir
Posté le 23-06-2007 à 10:11:09  profilanswer
 

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'


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [SQL] Fonctionnement des sous-requêtes

 

Sujets relatifs
[SQL] aide avec la fonction MAX()[resolu]probleme avec les '&' et les requetes ajax
Requêtes SQL sur AS400 via lien ODBC ? (PHP)Problème d'insert into en masse MySql / Sql
Sql et array : comment sortir un element ?[SQL server 2005] erreur clef trop grande !
[SQL Server 2005] Accès au donnée par requete SQL en VBProblème D'insertion dans SQL
[ACCESS] requete SQL max date 
Plus de sujets relatifs à : [SQL] Fonctionnement des sous-requêtes


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR