我觉得这个查询很容易构建,我只是想不出来。
我想用表Z列A中的数字替换表X列C中的所有数字,其中表X列C中的数字与表Z列B中的数字匹配。
我希望这是有道理的。也许一些背景信息会使它更清晰。我已经从一个CMS转换到另一个CMS,我用来转换的模块将id映射到新数据库。表X列A是新的id。表X列B是旧id。 表Z是我迁移的图库的表,而C列包含图像所有者的ID。
任何人都可以破解这个坚果吗?
答案 0 :(得分:1)
UPDATE X SET C=Z.A FROM Z WHERE X.C = Z.B
答案 1 :(得分:1)
为了完整性,第一个答案语法错误是由于FROM。更新语法不需要FROM,因为UPDATE定义了所有表和连接,SET实际上定义了要更新的内容。就直接语义而言,它有点倒退,而不像SELECT ... FROM ......那听起来像自然语言。例如,你会说
UPDATE X, Z
SET X.C = Z.A
WHERE X.C = Z.B
即使你根本不会更新表Z,但是人们会习惯它。很好的一点是,您可以像编写SELECT查询中的FROM部分一样编写UPDATE部分 - 因此它可以像您需要的那样复杂,并且仍然可以轻松地将SELECT查询转换为UPDATE查询(预览您的使用SELECT的UPDATE查询集是对实时数据的任何即席查询的良好实践。 从UPDATE查询转到SELECT只需用FROM替换UPDATE,用SELECT替换SET,用逗号替换等号(在SELECT部分中),当然把select放在最上面
SELECT X.C, Z.A
FROM X, Z
WHERE X.C = Z.B
将为您预览将要执行的操作,列出该字段的旧值以及将分配给它的新值。
Mysql有不错的docs。您可能更喜欢向后阅读它们 - 首先是示例到最后,然后是完整的参考定义。通常你会在文章下面找到一些非常有用的评论。
答案 2 :(得分:0)
试试这个:
更新X INNER JOIN Z ON X.C = Z.B SET X.C = Z.A
让我们从
开始X.foo X.C
A 1
B 2
和
Z.A Z.B
2 1
3 2
加入表格会导致
X.foo X.C Z.B Z.A
A 1 1 2
B 2 2 3
UPDATE
占用每一行,并将X.C中的值替换为同一行中Z.A中的值,从而产生:
X.foo X.C
A 2
B 3
如果Z.B
不是UNIQUE
,则可能会收到不需要的结果。
编辑:这只是一个例子。仔细选择JOIN
- 例如,您可能喜欢或不喜欢LEFT JOIN
。考虑一下X.C采用Z.B中不存在的值并判断您是否希望X.C保持不变或设置为NULL
的情况。
答案 3 :(得分:0)
我用titanoboas第一条评论解决了它,运行此查询:
更新X. LEFT JOIN Z ON Z.A = X.C. SET X.C = Z.A 在哪里X.C = Z.B
我现在看到你建议我不要使用LEFT JOIN,但幸运的是它按预期工作。 然后我尝试了gorans的例子,它也很完美。 Gorans的例子更容易理解,尽管这对我来说是一个很好的学习连接的教训。
感谢您的帮助!