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

标签 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; ano; valor_estimado, valor_realizado_oficial, indicador_fk, municipio_fk, und_federativa_fk

313885; "talend";2013;;888;2;2202;

291998;"suagenda";2013;900;;2;2202;

我想要第二个值:

291998;"suagenda";2013;900;888;2;2202;

我做错了什么?谢谢。

最佳答案

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

其中一些列用于相关更新中的加入条件。如果这些空值转换为 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...

关于sql - 插入而不是更新导致重复行。怎么修?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25417459/

相关文章:

sql - 如何按值长度搜索SQL?

performance - 具有多个 WHERE 等式的 Postgresql CREATE TABLE AS

arrays - PostgreSQL 难以从 jsonb 列中提取字段

sql - 通过存储过程从 SQL 导出二进制文件数据(图像)

sql - 如何按名称字母顺序列出,然后按最近的 SQL 列出?

sql - 查询交汇点/链路/桥接表,列数据作为标题

sql - 如何转置 SQLite 中的表?

django - 索引错误 : tuple index out of range

PostgreSQL 使用小于/大于(< 或 >)与严格左/右(<< 或 >>)比较日期范围和日期

postgresql - kubernetes集群中postgres的横向扩展