MYSQL Update Statement Inner Join Tables

201

Je n'ai aucune idée du problème. En utilisant MySQL 5.0, j'obtiens une erreur de compilation lors de la tentative d'exécution de l'instruction 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. Des pensées?

Vibration de la vie
la source
J'ai même enlevé l'alias, quand je change à un SELECT b * FROM affaires b jointure interne il fonctionne.
Vibration Of Life

Réponses:

433

Essaye ç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

Mettre à jour:

Puisque vous avez dit que la requête a généré une erreur de syntaxe, j'ai créé des tables sur lesquelles je pouvais le tester et j'ai confirmé qu'il n'y avait aucune 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

Voir? Aucune erreur de syntaxe. J'ai testé contre MySQL 5.5.8.

Asaph
la source
J'ai essayé cela 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; consultez le manuel qui correspond à la version de votre 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' à la ligne 1
Vibration Of Life
Veuillez poster les résultats de show create table business;et show create table business_geocode;ainsi je pourrai tester ma requête un peu mieux. Merci.
Asaph
Il n'y a pas d'erreur de syntaxe. Je viens de le confirmer et de mettre à jour ma réponse.
Asaph
4
@ user719316: Il y a quelque chose de louche avant cette requête ... vous manque un point-virgule?
Bobby
2
@Joakim Le ASmot clé est facultatif. Mais comme vous l'avez mentionné, je l'ai ajouté à la réponse par souci de cohérence, car je l'ai utilisé sur le premier alias de la même requête.
Asaph
15

La SETclause doit venir après la spécification de 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
mathiasfk
la source
-2

Pour MySql WorkBench, veuillez utiliser 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); 
Dépanneur
la source