【问题标题】:Target row updated by multiple source rows由多个源行更新的目标行
【发布时间】:2018-12-22 19:15:24
【问题描述】:
UPDATE tb
      FROM Table1 tb,
      (
        SELECT  oreplace(data, '.', '') AS data FROM Table2 
      ) tb2 
      SET column = 'Y'
      WHERE tb.column1 = tb2 .data OR tb.column2 = tb2 .data 
      OR tb.column3 = tb2 .data OR tb.column4 = tb2 .data OR tb.column5 = tb2 .data
      OR tb.column6 = tb2 .data ... upto tb.column15 = tb2 .data;

表 1 中的列默认为“N”。执行此更新查询时,我收到“由多个源行更新目标行”错误。我尝试使用 discint,但收到与没有重复项相同的错误。请帮忙。
谢谢!

【问题讨论】:

  • 我确定问题出在所有这些 OR 上。不是你有重复的行,而是OR条件匹配多行。
  • Table1 和 Table2 的完整定义是什么?

标签: sql teradata


【解决方案1】:

错误消息表明 TB 和 TB2 之间的连接不是唯一的,因此 TB 中的一行(“目标行”)在 TB2 中具有多于 1 行(“多个源行”)。 - 像(部分)产品加入。

您可以通过将 UPDATE 重写为 SELECT 并通过多个来源限定来检查重复行 - 或修改 UPDATE。 a) 每个目标列一次更新 b) 将连接放入子查询中,应用 distinct 然后更新

霍斯特

【讨论】:

    【解决方案2】:

    使用 distinct 可以检查整行是否唯一。但是,在应该只有唯一值的列中可能存在重复项。

    您可以使用限定语句从列中仅获取唯一值。

    SEL DISTINCT * FROM YOUR_TABLE_NAME
    
    QUALIFY ROW_NUMBER() OVER (
        PARTITION BY COL_NAME_WITH_DUPS ORDER BY COL_NAME_WITH_DUPS DESC
    ) = 1
    

    说明

    例如,请参见下表。所有行都是唯一的,但列 ID 具有重复值。如果您使用更新语句并在具有重复值(例如 ID)的列上进行匹配,则匹配算法会混淆,并且您会收到 teradata 错误 update failed 7547。

    -----------
    |ID|Name  |
    -----------
    |1 |Alfred|
    -----------
    |2 |Ben   |
    -----------
    |1 |Peter |
    -----------
    

    因此,您需要选择|1 |Alfred||1 |Peter | 行。使用qualify,您可以先对行进行排序,然后再选择第一个。

    来源

    https://hub.packtpub.com/how-to-prevent-errors-while-using-utilities-for-loading-data-in-teradata/

    【讨论】:

      猜你喜欢
      • 2019-12-28
      • 1970-01-01
      • 2019-10-07
      • 1970-01-01
      • 1970-01-01
      • 2020-01-17
      • 2021-10-24
      • 2019-06-21
      • 2019-07-09
      相关资源
      最近更新 更多