IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

Select imbriqué SQL


Sujet :

Langage SQL

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Avril 2012
    Messages : 10
    Points : 5
    Points
    5
    Par défaut Select imbriqué SQL
    Bonjour,

    Je cherche à faire une comparaison de champ à partir de deux Select, concrètement ce que je veux faire avec la mauvaise syntaxe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT champ1
      FROM table1
     WHERE champ1 = (SELECT DISTINCT MID(description, 39, 10)
                       FROM table2
                      WHERE id = 5
                        AND description like '%toto%')
    J'ai une erreur subqueries return more than one row ce que je comprend mais je voudrais justement que ça me retourne un tableau avec les équivalences.

    J'utilise SQL de manière très basique donc je ne maitrise pas très bien les jointures et autre fonctionnalités avancées de SQL.

    Merci d'avance de votre aide

  2. #2
    Membre émérite Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Points : 2 520
    Points
    2 520
    Par défaut
    Si tu veux en savoir plus sur le SQL en général, ces tutos sont très bien.

    Sinon ici tu essaye de comparer une valeur unique avec une liste de valeurs d'où l'erreur.

    Tu peux remplacer le = par IN.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT champ1 
    FROM table1 
    WHERE champ1 IN (SELECT DISTINCT  MID(description,39,10) FROM table2 WHERE id = 5 AND description like  '%toto%')
    Après il existe plusieurs manières de traiter le problème : jointure, EXISTS, ...

    P.S : pense à mettre les balises code pour ta requête
    ~ Lola ~

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Avril 2012
    Messages : 10
    Points : 5
    Points
    5
    Par défaut Requete
    Merci pour votre réponse rapide mais lorsque je lance cette requête dans phpmyadmin il ne fait rien, je n'ai pas d'erreur mais je n'ai pas de résultat non plus.

    Est-ce que cette requête est supposée poser problème ?

    Cordialement

  4. #4
    Membre émérite Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Points : 2 520
    Points
    2 520
    Par défaut
    Pouvez-vous nous donner la description de la table, un jeu de données et le résultat attendu ?

    Que renvoie la sous-requête ? Êtes-vous sur qu'elle renvoie au moins une valeur qui est comprise dans champ1 ?

    Je suppose que la requête postée n'est pas la requête telle quelle ? Si oui, alors seule la sous-requête suffit.
    ~ Lola ~

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Avril 2012
    Messages : 10
    Points : 5
    Points
    5
    Par défaut requete
    J'ai essayé sur une table beaucoup plus petite au niveau nombre d'enregistrements et ça fonctionne.

    Sur ma table de prod ( environ 1500 enregistrements ) ça plante, du moins je n'ai aucun résultat et je ne peux plus rien faire.

    J'ai lu que IN et NOT IN n'était pas les plus efficaces niveau usage des ressources, vous disiez que c'était possible avec des jointures ou exists serait-il possible de m’expliquer comment faire que j'essaye pour voir si c'est mieux.

    Pour répondre à votre question je récupère un login avec le mid et je le compare à ma base login.

    Merci de votre aide

  6. #6
    Membre émérite Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Points : 2 520
    Points
    2 520
    Par défaut
    En fait si tu ne peux plus rien faire sur ta base c'est que ta requête tourne encore. essaye de la laisser un peu pour voir ce que ça donne.

    Sinon pour les jointures :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT *
    FROM MaTable1
       JOIN (
          SELECT DISTINCT  MID(description,39,10) description
          FROM table2 
          WHERE id = 5 AND description LIKE  '%toto%'
       ) Tmp
       ON champ1 = description
    ~ Lola ~

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Avril 2012
    Messages : 10
    Points : 5
    Points
    5
    Par défaut requete
    Merci beaucoup de votre réponse.

    Effectivement en attendant le IN fonctionne mais c'est très long ( environ 8 minutes ), la jointure fonctionne beaucoup mieux ( quelques secondes ) mais en faite je souhaiterais obtenir le résultat inverse, c'est à dire l'équivalent du
    NOT IN.

    Pour le moment je récupère tous les enregistrements qui sont dans les 2 tables mais moi je souhaiterais récupérer tous les enregistrements de maTable1 qui ne sont pas dans la requete MID, avec une jointure bien sur car le NOT IN est trop long.


    Merci d'avance de votre temps passé à m'aider.

  8. #8
    Membre émérite Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Points : 2 520
    Points
    2 520
    Par défaut
    Tu peux mettre <> à la place de = dans ta jointure normalement...

    Peut-être qu'avec le NOT EXISTS ça sera mieux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT *
    FROM MaTable1 m1
    WHERE NOT EXISTS (SELECT * FROM MaTable2 m2 WHERE m1.champ1 = m2.champ2)
    Le reste est à adapter en fonction de ta requête...
    ~ Lola ~

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Avril 2012
    Messages : 10
    Points : 5
    Points
    5
    Par défaut requête
    Merci de votre réponse, je ne trouve pas de solution efficace à mon problème, seul la jointure est rapide mais je ne trouve pas de requête pouvant me donner les données recherché, je n'arrive qu'a trouver l'inverse.

    Merci du temps passé à m'aider.

  10. #10
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Points : 1 199
    Points
    1 199
    Par défaut
    Bonjour,
    Avec une jointure externe cela pourrait répondre à ton problème.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT *
    FROM MaTable1
       left outer JOIN (
          SELECT DISTINCT  MID(description,39,10) description
          FROM table2 
          WHERE id = 5 AND description LIKE  '%toto%'
       ) Tmp
       ON champ1 = description 
     
       where tmp.description is null
    Est-ce que ce sera performant peut-être pas.
    A+
    Soazig

  11. #11
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    En principe, NOT EXISTS est plus performant que la jointure externe et la restriction sur les NULL.

    Et ce qui améliore spectaculairement l'exécution des requêtes, c'est une bonne indexation. Vu le faible nombre de lignes évoqué, ça ne m'étonnerais pas que les tables ne soient pas indexées.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

Discussions similaires

  1. [SQL] Select imbriqué
    Par mcslash99 dans le forum PL/SQL
    Réponses: 10
    Dernier message: 03/07/2012, 09h39
  2. optimisation de requête sql avec select imbriquées
    Par yassine_le_boss dans le forum SQL
    Réponses: 6
    Dernier message: 02/11/2010, 22h12
  3. [SQL SERVER] SELECT IMBRIQUE -> Mettre une instruction.
    Par dacid dans le forum Langage SQL
    Réponses: 16
    Dernier message: 20/04/2009, 16h48
  4. [ SQL ] Faire un update avec un select imbriqué
    Par zozolh2 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 11/04/2005, 12h05
  5. Procédures stockées imbriquées SQL Server
    Par Mike69 dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 01/10/2003, 10h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo