【问题标题】:MERGE statement inserts incorrect data TSQLMERGE 语句插入不正确的数据 SQL
【发布时间】:2023-03-24 04:00:02
【问题描述】:

我正在尝试使用 MERGE 语句来更新表中的数据,并在该行不存在时插入数据。即使满足合并条件,插入的数据也有不正确的数据。

这些是必须插入的示例数据::

PrimaryFundName SsFundCode  PortfolioName   DataSourceName  AssetClass  SubAssetClass   Strategy    SubStrategy DataSourceFundName        CodeRedFundName
Ventures         33EU        Endowment      SS_Private Edge     Fixed Income   Private Equity   Venture Capital Growth Equity   137 Ventures III    137 Ventures III  
Ventures         33EU        Endowment      SS_Accounting       Equity    Private Equity    Venture Capital Growth Equity        137 VENTURES III LP 137 Ventures III

但是插入的数据在下面::

PrimaryFundName SsFundCode  PortfolioName   DataSourceName  AssetClass  SubAssetClass   Strategy    SubStrategy DataSourceFundName        CodeRedFundName
Ventures         33EU        Endowment      SS_Private Perf     Fixed Income   Private Equity   Venture Capital Growth Equity   137 Ventures III    137 Ventures III  
Ventures         33EU        Endowment      SS_Accounting       Equity    Private Equity    Venture Capital Growth Equity        137 VENTURES III 137 Ventures III

数据源和数据源基金名称不正确。以下是我的 MERGE 声明::

MERGE  FundRel FR
USING #FundTemp Tmp
 ON (FR.DataSourceFundName = Tmp.DataSourceFundName AND FR.PortFolioID = 
Tmp.PortFolioID AND FR.DataSourceID = Tmp.DataSourceID)
WHEN MATCHED THEN
  UPDATE  SET  FR.DataSourceFundName = Tmp.NewDataSourceFundName
  , FR.CodeRedFundName = Tmp.NewCodeRedFundName
  , FR.AssetClassID = Tmp.AssetClassID
  , FR.SubAssetClassID = Tmp.SubAssetClassID
   , FR.StrategyID = Tmp.StrategyID
 , FR.SubStrategyID = Tmp.SubStrategyID

WHEN NOT MATCHED BY TARGET THEN
 INSERT ([PortfolioID]
  ,[DataSourceID]
  ,[PrimaryFundID]
  ,[DataSourceFundName]
  ,[FundNumber]
  ,[AssetClassID]
  ,[SubAssetClassID]
  ,[StrategyID]
  ,[SubStrategyID]
  ,[CodeRedFundName])
  VALUES (Tmp.[PortfolioID]
  ,Tmp.[DataSourceID]
  ,Tmp.[PrimaryFundID]
  ,Tmp.[DataSourceFundName]
  ,Tmp.FundCode
  ,Tmp.[AssetClassID]
  ,Tmp.[SubAssetClassID]
  ,Tmp.[StrategyID]
  ,Tmp.[SubStrategyID]
  ,Tmp.[CodeRedFundName]);

请告知我做错了什么。谢谢!

更新:我解决了这个问题。不正确的数据来自时髦的 JOIN。

【问题讨论】:

    标签: sql sql-server sql-server-2008 tsql sql-server-2012


    【解决方案1】:

    您的问题与合并无关

    除非您不提供其他详细信息,例如表格示例数据和结构,否则我们怎么能说,为什么您会得到错误的结果。

    或者你可以像这样调试自己的,

    select tmp.*
    from FundRel FR
    inner join #FundTemp Tmp
     ON (FR.DataSourceFundName = Tmp.DataSourceFundName 
    AND FR.PortFolioID = Tmp.PortFolioID 
    AND FR.DataSourceID = Tmp.DataSourceID)
    

    【讨论】:

    • 你是对的@KumarHarsh。坏数据来自我的一个时髦的连接。我正在努力纠正这一点。感谢您的帮助
    【解决方案2】:

    仔细检查 WHEN MATCHED 块。 FR.CodeRedFundName = Tmp.NewCodeRedFundName 列名与您在上面提供的示例数据不同。

    【讨论】:

    • 感谢您的回复@Matt M。您提到的条件适合我的数据结构。
    猜你喜欢
    • 2017-01-18
    • 1970-01-01
    • 2013-01-26
    • 2011-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-26
    相关资源
    最近更新 更多