使用JOIN更新表无法正常工作

时间:2015-05-28 16:36:34

标签: mysql

我正在做这样的事情:

UPDATE `widget_list` a
       JOIN `geography` b
       ON b.`zip_code` = a.`zip_code`
SET    b.`msa` = a.`msa`;

执行得很好,但不影响任何行。对于所有行,msa设置为NULL,就好像它根本没有更改一样。 zip_codemsa具有相同的数据类型和长度,并且肯定会重叠zip_code。知道为什么这不会更新?

编辑:更新...我尝试使用不同的列名并运行,说我的一组行受到了影响,但实际上都没有改变。

EDIT2:如果我这样做,那么我的msa列会为每一行显示NULL。为什么这个值不适用于简单的连接?

  SELECT * FROM `widget_list` a
       JOIN `geography` b
       ON b.`zip_code` = a.`zip_code`

3 个答案:

答案 0 :(得分:0)

使用来执行加入

UPDATE widget_list
SET b.msa = a.msa
FROM widget_list a JOIN geography b ON b.zip_code = a.zip_code

答案 1 :(得分:0)

下面的内容应该有效。

UPDATE `widget_list`
SET `msa` = (SELECT `msa` FROM `geography` b
             JOIN `widget_list` a
             ON `a`.`zip_code` = `b`.`zip_code`
             );

答案 2 :(得分:0)

能够使用此fiddle

重现

但是,通过更改设置功能的顺序,它可以正常工作......就像在此fiddle

中一样
 UPDATE `widget_list` a
       JOIN `geography` b
       ON b.`zip_code` = a.`zip_code`
SET    a.`msa`=b.`msa` ;

并且它应该有效......暗示它在你的环境中是一个设置问题,或者我们错过了某些东西(也许是触发?)

Working Fiddle但请注意,如果每个邮政编码A存在超过一个msa,我在zip 123的示例中使用X ...系统只需选择一个并使用它进行更新。 X在我的例子中丢失了......你确定不会发生什么事吗? (这就是为什么我想查看示例数据以查看它是否是数据问题与语法与逻辑相比)

更新

fiddle因此,如果您的源表在zipcodes中具有空值,那么您将在目标表中获得空值...

所以如果我们添加....会发生什么。

 UPDATE `widget_list` a
       JOIN `geography` b
       ON b.`zip_code` = a.`zip_code`
      and b.msa is not null
SET    a.`msa`=b.`msa` ;

fiddle显示排除的空值