【问题标题】:Failure 7547 Target row updated by multiple source rows失败 7547 目标行被多个源行更新
【发布时间】:2019-12-28 21:29:24
【问题描述】:

我在 Teradata SQL Server 中运行查询时收到此错误消息“失败 7547 目标行已被多个源行更新。”

我知道我必须删除重复的行,但我不知道该怎么做。

MERGE INTO  ${DTTK_COMMON_default_database}.LA1DB51CTERELCTE AS TGT 
USING (SELECT SWTBAJAF
,NUMCLIENTE
,CSI
,CTR_NUMCSIR
,CTE_NUMREL
,CTR_TIPOREL
,CTR_NUMNOM
,CTR_TIPPAR
,CTR_PORCENT
,CTR_PUESTO
,CTE_FEALTA_2K
,CTE_FEMODI_2K
,FECINF
FROM ${DTTK_COMMON_default_database}.LA1DB51CTERELCTE_STG)
AS SRC
ON
TGT.NUMCLIENTE = SRC.NUMCLIENTE AND
TGT.CSI = SRC.CSI AND  
TGT.CTR_NUMCSIR = SRC.CTR_NUMCSIR AND 
TGT.CTE_NUMREL = SRC.CTE_NUMREL AND 
TGT.CTR_TIPOREL = SRC.CTR_TIPOREL 
WHEN MATCHED THEN UPDATE
SET
  SWTBAJAF = SRC.SWTBAJAF
 ,CTR_NUMNOM   = SRC.CTR_NUMNOM
 ,CTR_TIPPAR   = SRC.CTR_TIPPAR
 ,CTR_PORCENT  = SRC.CTR_PORCENT
 ,CTR_PUESTO   = SRC.CTR_PUESTO
 ,CTE_FEALTA_2K = SRC.CTE_FEALTA_2K
 ,CTE_FEMODI_2K = SRC.CTE_FEMODI_2K
         ,FECINF     = SRC.FECINF
WHEN NOT MATCHED THEN INSERT
(SWTBAJAF
,NUMCLIENTE
,CSI
,CTR_NUMCSIR
,CTE_NUMREL
,CTR_TIPOREL
,CTR_NUMNOM
,CTR_TIPPAR
,CTR_PORCENT
,CTR_PUESTO
,CTE_FEALTA_2K
,CTE_FEMODI_2K
,FECINF)
VALUES
(SRC.SWTBAJAF
,SRC.NUMCLIENTE
,SRC.CSI
,SRC.CTR_NUMCSIR
,SRC.CTE_NUMREL
,SRC.CTR_TIPOREL
,SRC.CTR_NUMNOM
,SRC.CTR_TIPPAR
,SRC.CTR_PORCENT
,SRC.CTR_PUESTO
,SRC.CTE_FEALTA_2K
,SRC.CTE_FEMODI_2K
,SRC.FECINF);

因此,我需要从表中删除重复的行。

【问题讨论】:

  • 这表示 ON 列(NUMCLIENTE、CSI、CTR_NUMCSIR、CTE_NUMREL、CTR_TIPOREL)的组合在源 LA1DB51CTERELCTE_STG 表中不是唯一的。如果源行 100% 相同,则可以像将 DISTINCT 添加到源查询一样简单。否则你必须想出一个规则来决定你要应用哪一个。

标签: sql teradata


【解决方案1】:

如果同一个键有多行,您应该找出导致问题的原因以及如何解决问题。

对于重复的行,一个简单的 SELECT DISTINCT 就足够了。

如果只有键是重复的,您可以进行聚合 (max/sum/avg),但在大多数情况下,您必须确定哪些行是 最新的,例如

USING (SELECT SWTBAJAF
,NUMCLIENTE
,CSI
,CTR_NUMCSIR
,CTE_NUMREL
,CTR_TIPOREL
,CTR_NUMNOM
,CTR_TIPPAR
,CTR_PORCENT
,CTR_PUESTO
,CTE_FEALTA_2K
,CTE_FEMODI_2K
,FECINF
FROM ${DTTK_COMMON_default_database}.LA1DB51CTERELCTE_STG
QUALIFY
   ROW_NUMBER()
   OVER(PARTITION BY NUMCLIENTE, CSI, CTR_NUMCSIR, CTE_NUMREL, CTR_TIPOREL
        ORDER BY ??? DESC) = 1 -- any timestamp/sequence to find the best match?
) AS SRC

【讨论】:

    猜你喜欢
    • 2018-12-22
    • 1970-01-01
    • 1970-01-01
    • 2014-08-24
    • 2017-09-28
    • 2014-09-23
    • 1970-01-01
    • 1970-01-01
    • 2019-08-16
    相关资源
    最近更新 更多