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