通过连接多个表来更新表

Posted

技术标签:

【中文标题】通过连接多个表来更新表【英文标题】:updating a table by joining multiple tables 【发布时间】:2009-09-07 03:01:38 【问题描述】:

我有以下问题

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

我似乎无法理解将实现这一目标的更新语句..

我不介意进行多次更新。但是在更新语句之后,上面的选择查询应该返回 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'

【问题讨论】:

【参考方案1】:

只需将 'SELECT...FROM' 替换为 'UPDATE' 并在 WHERE 之前添加一个 'SET ...' 子句:

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'

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

编辑:删除了多余的逗号...

【讨论】:

我已经尝试过了,但没有更新 b.catalogFileID。希望您的答案有效,但您的查询给了我这个错误(我正在使用 mysql):#1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 8 行的 'WHERE b.fileTypeID = 'gvl401' AND c.fileTypeID = 'gvl25' AND e.parentID = 'top' 附近使用正确的语法 如果显示“零行已更新”,则将其更改回选择以查看将更新的内容 - 将“更新”更改为“SELECT * FROM”并去掉“SET .. ..'条款。这会准确显示哪些行将被更新。此外,您的查询使用 LEFT JOIN,可能在表“b”或“d”中找不到匹配项,因此无需更新任何内容。 您的回答引导我找到正确的答案。我会接受你的回答并在我的帖子中发布正确的答案。【参考方案2】:

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

【讨论】:

【参考方案3】:

    识别所有具有此 ID 作为外键的表

    将您的代码包装在事务中

    列出个别更新。我无法准确说出您的架构是什么,但我认为是:

    UPDATE category_files set catalogFileID='cfil123' where categoryFileID='cfil960'; 更新 catalog_files_join 设置 catalogFileID='cfil123' 其中 categoryFileID='cfil960' 等等

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

【讨论】:

以上是关于通过连接多个表来更新表的主要内容,如果未能解决你的问题,请参考以下文章

通过查找另外两个表来更新用户 ID

通过连接不同服务器上两个数据库中的两个表来查询数据

在 Firebird 中使用连接多个表来避免重复值

数据网格视图更新,在 vb.net windows 窗体中编辑和删除,使用多个表来填充 datagridview

在 spring jparepository 中加入多个表

如何在Oracle中多次更新与另一个表连接的表?