插入而不是更新导致重复的行。怎么修?

时间:2014-08-21 02:40:21

标签: sql postgresql

我有一个数据库,其中应该只有一个具有2个值列的寄存器,可以由我的Web应用程序填充。在excel中给我的一个列的值,我们不得不把它放到数据库中。这样做的人应该使用“如果存在其他插入更新”,但他没有。现在,我们有一些数据,重复的行,只有列“valor_realizado_oficial”填充(列adt_login填充'talend'并且键列也填充),另一行填充了应用程序填充的另一列。 所以: 如果存在两行,我想将“valor_realizado_oficial”列的值从adt_login(如'talend')行复制到另一行并删除该行。 如果只存在一行,则不执行任何操作。

我尝试用以下内容执行复制部分:

update indicador_val iv 
  set valor_realizado_oficial=carga.valor_realizado_oficial 
  from (
      select valor_realizado_oficial, ano, municipio_fk, indicador_fk, und_federativa_fk 
         from indicador_val 
         where adt_login like 'talend' and ano=2013 ) carga 
  where iv.ano=2013 and iv.municipio_fk=carga.municipio_fk 
      and iv.indicador_fk=carga.indicador_fk and iv.ano=carga.ano 
      and iv.und_federativa_fk = carga.und_federativa_fk;

但受影响的0行。这是一对线的例子:

  

ID; adt_login;肛门; valor_estimado,valor_realizado_oficial,indicador_fk,municipio_fk,und_federativa_fk

     

313885; “拓蓝”; 2013 ;; 888; 2; 2202;

     

291998; “suagenda”; 2013; 900 ;; 2; 2202;

我想第二个,有价值观:

  

291998; “suagenda”; 2013; 900; 888; 2; 2202;

我做错了什么?感谢。

1 个答案:

答案 0 :(得分:0)

在示例数据中,有空列。例如,最后一个:und_federativa_fk

其中一些列用于相关UPDATE中的连接条件。如果这些空值转换为SQL NULL值,您应该意识到NULL=NULL作为条件将为NULL,这意味着在此上下文中为false

仅此一点就可以解释为什么没有行更新。

解决方案是使用IS NOT DISTINCT FROM作为可能为null的值的比较运算符。

示例:

 where iv.ano=2013 and iv.municipio_fk IS NOT DISTINCT FROM carga.municipio_fk 
      and iv.indicador_fk IS NOT DISTINCT FROM carga.indicador_fk
      etc...