232 votes

Requête MySQL de mise à jour des tables de jointures internes

Je n'ai aucune idée de l'origine du problème. Avec MySQL 5.0, j'obtiens une erreur de compilation lorsque je tente d'exécuter la requête de mise à jour MySQL suivante :

UPDATE  b
SET b.mapx = g.latitude,
    b.mapy = g.longitude
FROM business AS b
INNER JOIN business_geocode g ON b.business_id = g.business_id
WHERE (b.mapx = '' OR b.mapx = 0) AND
      g.latitude > 0

Tous les noms de champs sont corrects. Avez-vous des idées ?

0 votes

J'ai même supprimé l'alias, mais lorsque je le transforme en une jointure interne SELECT b.* FROM business b, cela fonctionne.

482voto

Asaph Points 56989

Essayez ça :

UPDATE business AS b
INNER JOIN business_geocode AS g ON b.business_id = g.business_id
SET b.mapx = g.latitude,
  b.mapy = g.longitude
WHERE  (b.mapx = '' or b.mapx = 0) and
  g.latitude > 0

Mise à jour :

Puisque vous avez dit que la requête produisait une erreur de syntaxe, j'ai créé quelques tables sur lesquelles je pouvais la tester et j'ai confirmé qu'il n'y avait pas d'erreur de syntaxe dans ma requête :

mysql> create table business (business_id int unsigned primary key auto_increment, mapx varchar(255), mapy varchar(255)) engine=innodb;
Query OK, 0 rows affected (0.01 sec)

mysql> create table business_geocode (business_geocode_id int unsigned primary key auto_increment, business_id int unsigned not null, latitude varchar(255) not null, longitude varchar(255) not null, foreign key (business_id) references business(business_id)) engine=innodb;
Query OK, 0 rows affected (0.01 sec)

mysql> UPDATE business AS b
    -> INNER JOIN business_geocode AS g ON b.business_id = g.business_id
    -> SET b.mapx = g.latitude,
    ->   b.mapy = g.longitude
    -> WHERE  (b.mapx = '' or b.mapx = 0) and
    ->   g.latitude > 0;
Query OK, 0 rows affected (0.00 sec)
Rows matched: 0  Changed: 0  Warnings: 0

Vous voyez ? Pas d'erreur de syntaxe. J'ai testé contre MySQL 5.5.8.

0 votes

J'ai essayé et j'obtiens la même erreur. -- Erreur lors de l'obtention du plan d'exécution : Vous avez une erreur dans votre syntaxe SQL ; vérifiez le manuel qui correspond à votre version du serveur MySQL pour la bonne syntaxe à utiliser près de 'UPDATE business as b INNER JOIN business_geocode g ON b.business_id = g.busines' at line 1

0 votes

Veuillez afficher les résultats de show create table business; et show create table business_geocode; pour que je puisse tester un peu mieux ma requête. Merci.

0 votes

Il n'y a pas d'erreur de syntaxe. Je viens de le confirmer et de mettre à jour ma réponse.

19voto

mathiasfk Points 673

Le site SET la clause devrait venir après la spécification de la table.

UPDATE business AS b
INNER JOIN business_geocode g ON b.business_id = g.business_id
SET b.mapx = g.latitude,
  b.mapy = g.longitude
WHERE  (b.mapx = '' or b.mapx = 0) and
  g.latitude > 0

-2voto

TroubleShooter Points 1

Pour MySql WorkBench, veuillez utiliser le formulaire ci-dessous :

update emp as a
inner join department b on a.department_id=b.id
set a.department_name=b.name
where a.emp_id in (10,11,12);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X