目标行由多个源行更新

时间:2018-07-14 16:53:21

标签: sql teradata

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,但收到相同的错误,因为没有重复项。请帮忙。
谢谢!

2 个答案:

答案 0 :(得分:0)

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

要么通过将UPDATE重写为SELECT来检查重复的行,然后通过多个源进行限定-要么修改UPDATE。 a)每个目标列一次更新 b)将联接放入子查询中,进行不同的应用,然后更新

霍斯特

答案 1 :(得分:0)

使用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具有重复的值。如果您使用update语句并在具有重复值(例如ID)的列上进行匹配,则匹配算法会感到困惑,并且您会收到Teradata错误更新失败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/