通过连接多个表来更新表

时间:2009-09-07 03:01:38

标签: sql mysql

我有以下查询

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'

提取一行数据:

topicShortName  catalogFileID   topicID
 Welcoming       cfil960         top318

我想运行一个更新语句,以便我可以将catalogFileID更新为'cfil123'。我有topicID和我在一起,它是'top318'

catalogFileID属于catalog_files

我似乎无法绕过更新语句来实现这一目标。

我不介意做多次更新。但是在更新语句之后,上面的select查询应该返回cfil123。但我不能只更新使用catalogFileID的所有表..

正确的回答:

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'

3 个答案:

答案 0 :(得分:0)

最好开始一个事务并分别更新每个表。 SQL更新语句旨在影响每个语句的一个表。

答案 1 :(得分:0)

  1. 标识具有此ID作为外键的所有表

  2. 将您的代码包含在交易中

  3. 列出个别更新。我无法确切地说出你的架构是什么,但我认为它是:

    UPDATE category_files set catalogFileID ='cfil123'其中categoryFileID ='cfil960'; UPDATE catalog_files_join set catalogFileID ='cfil123'其中categoryFileID ='cfil960' 等

  4. 这将更新对类别文件的所有引用,这可能不是您想要的。

答案 2 :(得分:0)

只需将“SELECT...FROM”替换为“UPDATE”,然后在SET ...之前添加“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'

确保使用SET符号指定要在<table>.<field>子句中更新哪些表的字段。

编辑:删除了额外的逗号...