通过连接多个表来更新表
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' 等等
这将更新对类别文件的所有引用,这可能不是您想要的。
【讨论】:
以上是关于通过连接多个表来更新表的主要内容,如果未能解决你的问题,请参考以下文章