【问题标题】:Merge Statement SSIS合并语句 SSIS
【发布时间】:2013-07-18 10:19:05
【问题描述】:

我在 SSMS 上测试了这段代码

Merge dim_BTS AS Target using  
(
    SELECT  A.BTS, D.idVille  
    FROM onAir A  
    INNER JOIN dbo.DIM_AXE_GEO D   
        ON A.Ville = D.Villle   

) AS Source ON Source.BTS = Target.BTS  


WHEN MATCHED THEN  
UPDATE  
SET Target.idVille = Source.idVille;  

告诉我这个错误

MERGE 语句试图更新或删除同一行更多
不止一次。当目标行匹配多个源时会发生这种情况 排。 MERGE 语句不能更新/删除同一行 目标表多次。细化 ON 子句以确保目标 行最多匹配一个源行,或使用 GROUP BY 子句 对源行进行分组。

你能帮我做什么吗?

【问题讨论】:

  • 语法不需要指定AS Source(which columns) 吗?
  • 我从源表中指定了 BTS 列,只是为了通过使用 bts 来了解 IDvILLE
  • 您无需为同一问题开新票 (stackoverflow.com/questions/17710051/…)。 ——

标签: sql ssis business-intelligence


【解决方案1】:

您的 Source 子查询返回具有相同 BTS(您用于加入目标的列)的重复行,这在 MERGE 语句中是不允许的。

您可以使用 CTE 中的 ROW_NUMBER() 函数优化查询以仅过滤每个 BTS 的最新行

WITH CTE_Source AS 
(
    SELECT  A.BTS, D.idVille, ROW_NUMBER() OVER (PARTITION BY A.BTS ORDER BY d.idVille DESC)  RN -- choose order of your preference
    FROM onAir A  
    INNER JOIN dbo.DIM_AXE_GEO D   
        ON A.Ville = D.Villle   
)
Merge dim_BTS AS Target using  
(
    SELECT  * FROM CTE_Source WHERE RN=1
) AS Source ON Source.BTS = Target.BTS  
WHEN MATCHED THEN  
UPDATE  
SET Target.idVille = Source.idVille; 

或者如果需要插入多行BTS,则在加入目标时需要在ON子句中添加更多列。

【讨论】:

  • 非常感谢它现在可以工作,但你能帮我如何在 SSIS 上添加这个代码吗?我需要你的帮助,我有 staging table on-Air(BTS ,Ville,region,zone) 和表 dim_BTS(BTS,BSC,statut,date_BTS,classe,idVille) dimAxeGeographi(idVille,ville,zmr,region) 和 dim_BTS 这是空的最好的问候
  • @user2586714 与您通常向 SSIS 添加代码的方式没有什么不同 - 使用 ExecuteSQL 任务。
  • 是的,我在控制流表面的执行 SQL 任务中做了。但是 dim_BTS 是空的,我可以在数据流中添加什么
  • agilebi.com/jwelch/2007/07/05/… - 您可以使用数据流在临时表中准备数据(CTE + SELECT WHERE RN=1),然后在 executesql 任务中使用临时表进行 MERGE
  • 或者您可以将整个 MERGE 放在存储过程中,然后从 ssis 执行它
【解决方案2】:

看看你的SELECT 声明。您可能必须添加DISTINCT,或另一个JOIN 条件,或WHERE 子句以确保行不重复。

【讨论】:

  • 当我添加在 Dim_BTS 上添加的前 1 个 idVille 但仅更改了一行并且当我执行前 10 个时不起作用。我想更新目标表上的 allll idville 请帮助我:(
  • 我尝试了这段代码,但 O 行影响了问题是什么?将 fact_table 合并为目标,使用(从 dbo.dim_date_fin 中选择前 1 个 idDatefin、PK_Date_fin、Week_Of_Year)作为演员表源(source.PK_Date_fin 作为日期)=cast(target.DATE_fin_ALaRM 作为日期),然后更新设置 target.ID_TEMP_DEB=source。 idDatefin,目标.NUMEROSEMAINE=source.Week_Of_Year; heeeeelp 请;(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-21
  • 2014-09-29
  • 2011-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多