Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 03/08/2011, 16h54   #1
Nouveau Membre du Club
 
Inscription : juin 2008
Messages : 80
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 80
Points : 38
Points : 38
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 :
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.
Keweed est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/08/2011, 20h29   #2
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 019
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 11 019
Points : 18 302
Points : 18 302
Envoyer un message via MSN à CinePhil
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 de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/08/2011, 10h34   #3
Nouveau Membre du Club
 
Inscription : juin 2008
Messages : 80
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 80
Points : 38
Points : 38
Une question car là, mes connaissances en SQL ne suffisent pas.

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

Code :
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 :
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".
Keweed est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/08/2011, 11h02   #4
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 019
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 11 019
Points : 18 302
Points : 18 302
Envoyer un message via MSN à CinePhil
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 :
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 :
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 de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/08/2011, 18h09   #5
Nouveau Membre du Club
 
Inscription : juin 2008
Messages : 80
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 80
Points : 38
Points : 38
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.
Keweed est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/08/2011, 10h21   #6
Modérateur
 
Avatar de Bisûnûrs
 
Josselin
Développeur Web
Inscription : janvier 2004
Messages : 9 050
Détails du profil
Informations personnelles :
Nom : Josselin
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : janvier 2004
Messages : 9 050
Points : 12 181
Points : 12 181
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 :
1
2
3
4
SELECT
   `nom d'un champ`
FROM
   `table accentuée`
Bisûnûrs est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/08/2011, 11h14   #7
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 019
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 11 019
Points : 18 302
Points : 18 302
Envoyer un message via MSN à CinePhil
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 de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/08/2011, 11h21   #8
Modérateur
 
Avatar de Bisûnûrs
 
Josselin
Développeur Web
Inscription : janvier 2004
Messages : 9 050
Détails du profil
Informations personnelles :
Nom : Josselin
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : janvier 2004
Messages : 9 050
Points : 12 181
Points : 12 181
Citation:
Envoyé par CinePhil Voir le message
Il vaut mieux nommer ces bases de données, tables et colonnes correctement plutôt que de s'emmerder avec ces bidules disgracieux
On est d'accord.
Bisûnûrs est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 12h32.


 
 
 
 
Partenaires

Hébergement Web