帮助构建查询 - 比较列并替换数字

时间:2010-03-18 15:14:20

标签: mysql

我觉得这个查询很容易构建,我只是想不出来。

我想用表Z列A中的数字替换表X列C中的所有数字,其中表X列C中的数字与表Z列B中的数字匹配。

我希望这是有道理的。也许一些背景信息会使它更清晰。我已经从一个CMS转换到另一个CMS,我用来转换的模块将id映射到新数据库。表X列A是新的id。表X列B是旧id。 表Z是我迁移的图库的表,而C列包含图像所有者的ID。

任何人都可以破解这个坚果吗?

4 个答案:

答案 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的例子更容易理解,尽管这对我来说是一个很好的学习连接的教训。

感谢您的帮助!