2009-09-07 6 views
4

J'ai la requête suivantemise à jour d'une table en joignant plusieurs tables

SELECT e.topicShortName, d.catalogFileID, e.topicID 
FROM catalog_topics a 
LEFT JOIN catalog_files_join b ON a.catalogID = b.foreignKey 
LEFT JOIN catalog_files_join c ON c.foreignKey = b.catalogFileID 
LEFT JOIN catalog_files d ON d.catalogFileID = b.catalogFileID 
LEFT JOIN catalog_lu_topics e ON a.topicID = e.topicID 
WHERE b.fileTypeID = 'gvl401' 
AND c.fileTypeID = 'gvl25' 
AND e.parentID = 'top305' 
AND a.sortorder =1 
AND e.topicID = 'top318' 

qui me va chercher une ligne de données:

topicShortName catalogFileID topicID 
Welcoming  cfil960   top318 

Je veux exécuter une instruction de mise à jour afin que je puisse mettre à jour catalogFileID à 'cfil123'. Je le topicID avec moi, il est « top318 »

catalogFileID appartient à catalog_files

Je ne peux pas semble envelopper ma tête autour de la déclaration de mise à jour qui permettra d'atteindre ce ..

Je ne rechignent pas à faire plusieurs mises à jour. Mais après les instructions de mise à jour, la requête select ci-dessus devrait renvoyer cfil123. Mais je ne peux pas simplement mettre à jour toutes les tables où catalogFileID est utilisé ..

CORRECT RÉPONSE:

UPDATE catalog_topics a 
LEFT JOIN catalog_files_join b ON a.catalogID = b.foreignKey 
LEFT JOIN catalog_files_join c ON c.foreignKey = b.catalogFileID 
LEFT JOIN catalog_files d ON d.catalogFileID = b.catalogFileID 
LEFT JOIN catalog_lu_topics e ON a.topicID = e.topicID 
SET d.catalogFileID = 'Cfil123', 
    b.catalogFileID = 'Cfil123', 
    c.foreignKey = 'Cfil123' 
WHERE b.fileTypeID = 'gvl401' 
AND c.fileTypeID = 'gvl25' 
AND e.parentID = 'top305' 
AND a.sortorder =1 
AND e.topicID = 'top318' 

Répondre

0

vous suffit de remplacer 'SELECT...FROM' avec 'UPDATE' et ajouter une clause 'SET ...' avant WHERE:

UPDATE catalog_topics a 
LEFT JOIN catalog_files_join b ON a.catalogID = b.foreignKey 
LEFT JOIN catalog_files_join c ON c.foreignKey = b.catalogFileID 
LEFT JOIN catalog_files d ON d.catalogFileID = b.catalogFileID 
LEFT JOIN catalog_lu_topics e ON a.topicID = e.topicID 
SET d.catalogFileID = 'cfil123', 
    b.catalogFileID = 'cfil123' 
WHERE b.fileTypeID = 'gvl401' 
AND c.fileTypeID = 'gvl25' 
AND e.parentID = 'top305' 
AND a.sortorder =1 
AND e.topicID = 'top318' 

Assurez-vous que vous spécifiez que les champs de tables de mise à jour dans la clause SET en utilisant la notation <table>.<field>.

Edit: Suppression de virgule supplémentaire ...

+0

J'avais essayé exacly, mais ne pas mettre à jour b.catalogFileID. J'espère que votre réponse fonctionne mais votre requête me donne cette erreur (j'utilise MySQL): # 1064 - Vous avez une erreur dans votre syntaxe SQL; consultez le manuel qui correspond à votre version du serveur MySQL pour la bonne syntaxe à utiliser près de 'WHERE b.fileTypeID =' gvl401 ' ET c.fileTypeID =' gvl25 ' ET e.parentID =' top 'à la ligne 8 –

+0

oh nvmd vous avez eu une virgule supplémentaire –

+0

damnit.Maintenant, il dit zéro lignes mises à jour :( –

0

Mieux vaut commencer une transaction et mettre à jour chaque tableau séparément. Les instructions de mise à jour SQL sont destinées à affecter une table par instruction.

0
  1. Identifier toutes les tables qui ont cet ID comme une clé étrangère

  2. Enveloppez votre code dans une transaction

  3. Liste des mises à jour individuelles. Je ne peux pas dire exactement quel est votre schéma, mais je pense que c'est:

    UPDATE category_files set catalogFileID = 'cfil123' où categoryFileID = 'cfil960'; MISE À JOUR catalog_files_join mis catalogFileID = « cfil123 » où categoryFileID = s cfil960 ' etc.

Cette mettra à jour toutes les références au fichier de la catégorie, qui ne peut être ce que vous voulez.

Questions connexes