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

Requêtes MySQL Discussion :

Subquery returns more than 1 row


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Juin 2008
    Messages
    85
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 85
    Par défaut Subquery returns more than 1 row
    Bonjour,

    Je rencontre actuellement un problème assez étrange avec une requête SQL tournant de façon automatique chaque jour depuis plusieurs années et qui d'un coup rencontre l'erreur suivante : Subquery returns more than 1 row.

    Voici la requête en question :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    select `b`.`art` AS `art`,
    (select `a1`.`art_2` AS `art_2` from (`phase2_BOM2` `a1` join `QA` on((`a1`.`art_2` = `QA`.`art`))) where ((`b`.`art` = `a1`.`art`) and (`QA`.`groupe` in (100,101,110)))) AS `a1`,
    (select `a2`.`art_2` AS `art_2` from (`phase2_BOM2` `a2` join `QA` on((`a2`.`art_2` = `QA`.`art`))) where ((`b`.`art` = `a2`.`art`) and (`QA`.`groupe` not in (100,101,110)))) AS `a2`,
    `b`.`type` AS `tp` 
    from `phase2_BOM2` `b` 
    where (`b`.`type` = _latin1'K') 
    union 
    select test.`art` AS `art`,test.`art_2` AS `art_2`,NULL AS `NULL`,test.`type` AS `type` 
    from `phase2_BOM2` AS test
    where (test.`type` = _latin1'I')
    Ce qui est d'autant plus étrange, c'est lorsque j’exécute les 2 requêtes de l'union séparément je n'ai aucune erreur.

    Edit: Plus étrange encore, sur un serveur de test étant une copie conforme du serveur de prod (même version mysql) la requête passe.

    Merci d'avance.

  2. #2
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 818
    Billets dans le blog
    14
    Par défaut
    Le message est clair : une sous-requête retourne plus d'une ligne. Il s'agit sans doute d'une des deux sous-requêtes figurant dans la partie SELECT de la première requête.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    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 !

  3. #3
    Membre confirmé
    Inscrit en
    Juin 2008
    Messages
    85
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 85
    Par défaut
    Une question car là, mes connaissances en SQL ne suffisent pas.

    Quelle est la différence entre ces deux requêtes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT `b`.`art` AS `art`,
    (SELECT `a1`.`art_2` AS `art_2` FROM (`phase2_BOM2` `a1` JOIN `QA` ON((`a1`.`art_2` = `QA`.`art`))) WHERE ((`b`.`art` = `a1`.`art`) AND (`QA`.`groupe` IN (100,101,110)))) AS `a1`,
    (SELECT `a2`.`art_2` AS `art_2` FROM (`phase2_BOM2` `a2` JOIN `QA` ON((`a2`.`art_2` = `QA`.`art`))) WHERE ((`b`.`art` = `a2`.`art`) AND (`QA`.`groupe` NOT IN (100,101,110)))) AS `a2`,
    `b`.`type` AS `tp` 
    FROM `phase2_BOM2` `b` 
    WHERE (`b`.`type` = _latin1'K')
    qui fonctionne très bien. Et :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    (SELECT `b`.`art` AS `art`,
    (SELECT `a1`.`art_2` AS `art_2` FROM (`phase2_BOM2` `a1` JOIN `QA` ON((`a1`.`art_2` = `QA`.`art`))) WHERE ((`b`.`art` = `a1`.`art`) AND (`QA`.`groupe` IN (100,101,110)))) AS `a1`,
    (SELECT `a2`.`art_2` AS `art_2` FROM (`phase2_BOM2` `a2` JOIN `QA` ON((`a2`.`art_2` = `QA`.`art`))) WHERE ((`b`.`art` = `a2`.`art`) AND (`QA`.`groupe` NOT IN (100,101,110)))) AS `a2`,
    `b`.`type` AS `tp` 
    FROM `phase2_BOM2` `b` 
    WHERE (`b`.`type` = _latin1'K'))
    qui me retourne l'erreur "Subquery returns more than 1 row".

  4. #4
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 818
    Billets dans le blog
    14
    Par défaut
    Une requête ne commence pas par une parenthèse ! Ou alors ça veut dire que cette requête est encore incluse dans une autre ?

    D'ailleurs il y a beaucoup de trucs inutiles dans tes requêtes : Ces saloperies d'apostrophes inversées ajoutées par phpMyAdmin et un bon paquet de parenthèses ; tu viens de la forêt de parenthèses d'Access ou quoi ?

    Voici ta première requête récrite sans le superflu et indentée correctement pour la rendre plus lisible :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    SELECT b.art AS art,
        (
            SELECT a1.art_2 AS art_2 
            FROM phase2_BOM2 a1 
            JOIN QA ON a1.art_2 = QA.art 
            WHERE b.art = a1.art 
                AND QA.groupe IN (100, 101, 110)
        ) AS a1,
        (
            SELECT a2.art_2 AS art_2 
            FROM phase2_BOM2 a2 
            JOIN QA ON a2.art_2 = QA.art 
            WHERE b.art = a2.art 
                AND QA.groupe NOT IN (100, 101, 110)
        ) AS a2,
        b.type AS tp 
    FROM phase2_BOM2 b 
    WHERE b.type = _latin1'K'
    Et je pense que cette requête devrait donner le même résultat avec un meilleur temps de réponse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT b.art AS art,
        a1.art_2 AS art_2,
        a2.art_2 AS art_2,
        b.type AS tp 
    FROM phase2_BOM2 b 
    INNER JOIN phase2_BOM2 a1 ON b.art = a1.art
        INNER JOIN QA qa1 ON a1.art_2 = qa1.art
    INNER JOIN phase2_BOM2 a2 ON b.art = a2.art
        INNER JOIN QA qa2 ON a2.art_2 = qa2.art
    WHERE b.type = _latin1'K'
        AND qa1.groupe IN (100, 101, 110)
        AND qa2.groupe NOT IN (100, 101, 110)
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    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 !

  5. #5
    Membre confirmé
    Inscrit en
    Juin 2008
    Messages
    85
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 85
    Par défaut
    Je sais bien qu'une requête ne commence pas par une parenthèse ...
    C'était une manière simplifié de présenter les choses car lorsque je fais une UNION sur la requête sans les parenthèse cela revient au même que mettre des parenthèse autour de la requête (ce qui fais qu'elle ne fonctionne plus).

    Ce n'est pas ma requête donc je ne cherche pas à l'optimiser, juste à savoir pourquoi elle ne fonctionne plus alors que cela faisait des années qu'elle tournait sans problème.

    Enfin j'ai déjà fais la modification avec les jointures car je n'ai pas trouvé d'autre solution. C'est juste que j'aurais aimé comprendre la différence avec et sans les parenthèses autour de la requête. Enfin j'ai une vague idée, je pense que cela vient des données mais bon ça fonctionne pour l'instant donc je vais faire avec.

  6. #6
    Modérateur
    Avatar de Bisûnûrs
    Profil pro
    Développeur Web
    Inscrit en
    Janvier 2004
    Messages
    9 931
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2004
    Messages : 9 931
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    Ces saloperies d'apostrophes inversées ajoutées par phpMyAdmin
    En fait il s'agit simplement de délimiteurs (pas forcément inutiles). En effet, quand une table ou un champ a un nom .. "spécial" .. avec des accents, des espaces, des apostrophes (oui oui, c'est possible (selon la documentation MySQL : "Un nom d'identifiant est constitué de caractères alpha-numériques issus du jeu de caractères courant, plus ‘_’ et ‘$’."), j'en ai fait l'expérience malgré moi), il convient de les utiliser pour que la requête se passe sans anicroche.

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT
       `nom d'un champ`
    FROM
       `table accentuée`

  7. #7
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 818
    Billets dans le blog
    14
    Par défaut
    Oui mais dans son cas comme dans 90% des cas que j'ai vu sur ce forum, malgré la proportion assez forte de gens n'ayant pas connaissance des noms mal formés, ces saloperies d'apostrophes inversées sont inutiles.
    Il vaut mieux nommer ces bases de données, tables et colonnes correctement plutôt que de s'emmerder avec ces bidules disgracieux !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    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. #1242 - Subquery returns more than 1 row
    Par Loan26 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 07/11/2007, 21h32
  2. Réponses: 4
    Dernier message: 25/01/2007, 16h02
  3. Réponses: 3
    Dernier message: 08/12/2006, 18h28
  4. ORA-01427: single-row subquery returns more than one row
    Par hadid dans le forum Langage SQL
    Réponses: 3
    Dernier message: 31/10/2006, 16h35
  5. Subquery returns more than 1 row
    Par Mathelec dans le forum Requêtes
    Réponses: 12
    Dernier message: 03/08/2006, 15h25

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