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 19/08/2011, 12h47   #1
Nouveau Membre du Club
 
Inscription : juin 2005
Messages : 143
Détails du profil
Informations forums :
Inscription : juin 2005
Messages : 143
Points : 26
Points : 26
Envoyer un message via MSN à garthos
Par défaut UPDATE avec SUBQUERY

Bonjour à tous !

Je galère pour faire un update massif sur un champ d'une table.

Alors j'ai 2 tables, T_HALL qui correspond donc à des salles et T_CITY qui correspond donc à des villes de rattachement.

Dans T_HALL j'ai un champ city_id (celui que je veux updaté car il est null à l'heure actuelle) qui correspond à l'id de la ville de rattachement (T_CITY)
j'ai également un champ T_HALL.city qui correspond au nom de la ville.

Dans T_CITY, J'ai un champ id et champ name qui correspond au nom de la ville.

L'idée est donc d'updater le champ T_HALL.city_id pour chacune des salles où je trouve l'id dans la table des villes de rattachement en se basant sur les noms, et ceci pour dégrossir car j'ai évidemment des cas particuliers comme les villes ayant des arrondissements...
J'ai fait une table de villes de rattachement pour me simplifier la vie avec les différents codes postaux et noms de villes qui peuvent être multiples (cas des arrondissements par exemple et il peux également y avoir plusieurs codes postaux pour une même ville ou plusieurs villes avec le même code postal) ...

Donc voici ce que j'ai essayé sans succès :
Code :
1
2
3
4
 
UPDATE T_HALL
SET T_HALL.city_id = (SELECT T_CITY.id FROM T_CITY WHERE T_CITY.name = T_HALL.city)
WHERE EXISTS (SELECT T_CITY.id FROM T_CITY WHERE T_CITY.name = T_HALL.city);
ça me renvoie :
Code :
Subquery returns more than 1 row
J'aurais donc besoin de vous pour comprendre ce qui cloche car je suis loin d'être expert sql.

Merci d'avance.
garthos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/08/2011, 12h51   #2
Membre Expert
 
Avatar de Yanika_bzh
 
Homme Yannick
Ingénieur Etudes & Developpements
Inscription : février 2006
Messages : 1 125
Détails du profil
Informations personnelles :
Nom : Homme Yannick
Localisation : France, Deux Sèvres (Poitou Charente)

Informations professionnelles :
Activité : Ingénieur Etudes & Developpements
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 1 125
Points : 1 670
Points : 1 670
L'erreur est très explicite

Code :
SELECT T_CITY.id FROM T_CITY WHERE T_CITY.name = T_HALL.city
Vous ramène plus d'une 1 ligne de résultat, donc impossible de faire l'update.
Il doit donc exister des doublons de nom dans votre table T_CITY.
__________________
Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)
Yanika_bzh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/08/2011, 13h05   #3
Nouveau Membre du Club
 
Inscription : juin 2005
Messages : 143
Détails du profil
Informations forums :
Inscription : juin 2005
Messages : 143
Points : 26
Points : 26
Envoyer un message via MSN à garthos
exact il y a des doublons vu qu'il y a plusieurs villes qui ont le même nom ...
J'avais pas pensé à ça ! merci
je vais donc utiliser le Code Postal mais bon du coup ça va beaucoup plus filtrer avec cette histoire des multiples codes postaux ...
Bon tant pis...
garthos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/08/2011, 13h12   #4
Nouveau Membre du Club
 
Inscription : juin 2005
Messages : 143
Détails du profil
Informations forums :
Inscription : juin 2005
Messages : 143
Points : 26
Points : 26
Envoyer un message via MSN à garthos
Et sinon sais tu comment faire une requête pour identifier ces doublons ?
garthos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/08/2011, 13h15   #5
Membre Expert
 
Avatar de Yanika_bzh
 
Homme Yannick
Ingénieur Etudes & Developpements
Inscription : février 2006
Messages : 1 125
Détails du profil
Informations personnelles :
Nom : Homme Yannick
Localisation : France, Deux Sèvres (Poitou Charente)

Informations professionnelles :
Activité : Ingénieur Etudes & Developpements
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 1 125
Points : 1 670
Points : 1 670
Genre ceci ?

Code :
1
2
3
4
5
6
7
SELECT 
    name 
FROM
    T_CITY 
GROUP BY
  name
HAVING COUNT (1)>1
__________________
Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)
Yanika_bzh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/08/2011, 16h47   #6
Nouveau Membre du Club
 
Inscription : juin 2005
Messages : 143
Détails du profil
Informations forums :
Inscription : juin 2005
Messages : 143
Points : 26
Points : 26
Envoyer un message via MSN à garthos
Merci bien

Bon sinon j'ai une autre question, j'ai tenté autre chose mais je bloque !

En fait j'ai fait ceci :

Code :
1
2
3
UPDATE T_HALL
SET T_HALL.city_id = (SELECT T_CITY.id FROM T_CITY WHERE name = 'albi')
WHERE city LIKE 'albi';
Mais j'aimerais bien appliquer ceci à toute une liste de noms de ville, retournée par cette requête :
Code :
SELECT city FROM T_HALL WHERE city_id IS NULL GROUP BY city ORDER BY city;
En gros il faudrait remplacer le "albi" de ma requête test pour que ça l'applique sur toute la liste retournée par cette 2ème requête.

Est-ce que c'est possible juste par SQL ?

Merci d'avance
garthos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/08/2011, 17h20   #7
Membre Expert
 
Avatar de Yanika_bzh
 
Homme Yannick
Ingénieur Etudes & Developpements
Inscription : février 2006
Messages : 1 125
Détails du profil
Informations personnelles :
Nom : Homme Yannick
Localisation : France, Deux Sèvres (Poitou Charente)

Informations professionnelles :
Activité : Ingénieur Etudes & Developpements
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 1 125
Points : 1 670
Points : 1 670
Votre requête va vous poser les mêmes problèmes, si vous n'avez pas résolu votre souci de doublon ...
__________________
Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)
Yanika_bzh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/08/2011, 17h29   #8
Nouveau Membre du Club
 
Inscription : juin 2005
Messages : 143
Détails du profil
Informations forums :
Inscription : juin 2005
Messages : 143
Points : 26
Points : 26
Envoyer un message via MSN à garthos
J'ai a priori résolu les doublons .... donc est ce que c'est possible de faire ça en sql ?
garthos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/08/2011, 17h37   #9
Membre Expert
 
Avatar de Yanika_bzh
 
Homme Yannick
Ingénieur Etudes & Developpements
Inscription : février 2006
Messages : 1 125
Détails du profil
Informations personnelles :
Nom : Homme Yannick
Localisation : France, Deux Sèvres (Poitou Charente)

Informations professionnelles :
Activité : Ingénieur Etudes & Developpements
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 1 125
Points : 1 670
Points : 1 670
Essayez quelque chose du genre

Code :
1
2
3
4
5
6
7
UPDATE 
	T_HALL,	
	T_CITY
SET
	T_HALL.city_id = T_CITY.id
WHERE
	T_HALL.city = T_CITY.name
Bon courage
__________________
Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)
Yanika_bzh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/08/2011, 17h51   #10
Nouveau Membre du Club
 
Inscription : juin 2005
Messages : 143
Détails du profil
Informations forums :
Inscription : juin 2005
Messages : 143
Points : 26
Points : 26
Envoyer un message via MSN à garthos
désolé de te déranger de nouveau mais je ne pige pas ou je vais mettre ma sous requête :

Code :
SELECT city FROM T_HALL WHERE city_id IS NULL GROUP BY city ORDER BY city;
merci d'avance
garthos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/08/2011, 15h33   #11
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 013
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 013
Points : 18 289
Points : 18 289
Envoyer un message via MSN à CinePhil
Tu n'as pas besoin de sous-requête. La requête de Yanika_bzh peut être écrite avec les jointures normalisées de cette façon :
Code :
1
2
3
UPDATE T_HALL h
INNER JOIN T_CITY c ON c.name = h.city
SET T_HALL.city_id = T_CITY.id
__________________
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 24/08/2011, 18h22   #12
Nouveau Membre du Club
 
Inscription : juin 2005
Messages : 143
Détails du profil
Informations forums :
Inscription : juin 2005
Messages : 143
Points : 26
Points : 26
Envoyer un message via MSN à garthos
ok merci
garthos 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 11h22.


 
 
 
 
Partenaires

Hébergement Web