【问题标题】:Using MERGE in SQL Server 2014在 SQL Server 2014 中使用 MERGE
【发布时间】:2018-03-22 23:20:20
【问题描述】:

我在 SQL Server 中使用 MERGE 时遇到问题。

MERGE Info_Game AS t 
USING (
with cte_example 
as
(SELECT ig_idx,ig_team1,ig_team2benefit,ig_game_type
FROM (select ig_idx,ig_team1,ig_team2benefit,ig_game_type,
RANK() OVER(partition by ig_root,ig_game_type order by ig_idx asc) AS rank
FROM  info_game ) AS t1
WHERE rank < 2)

select *
       ,count(name) over(partition by name) count
from cte_example

) s ON t.ig_outcome_id = s.ig_idx 

WHEN MATCHED THEN
    UPDATE 
        SET s.IG_Team1Benefit = t.pv_v1,
            s.ig_drawbenefit = t.pv_v2,
            s.IG_Team2Benefit = t.pv_v3

WHEN NOT MATCHED THEN
    INSERT (ig_idx, ig_team1, ig_team2benefit, ig_game_type) 
    VALUES (s.ig_idx, s.ig_team1, s.ig_team2benefit, s.ig_game_type)
OUTPUT $action, Inserted.*, Deleted.*;

但我在 WITH cte_example 中遇到错误

消息 156,第 15 级

我该怎么做?

【问题讨论】:

  • 将公用表表达式放在合并语句之外

标签: sql-server merge upsert


【解决方案1】:

Cte 不应该在 Merge 语句中。把它移出来。

;with cte_example 
as
(SELECT ig_idx,ig_team1,ig_team2benefit,ig_game_type
FROM (select ig_idx,ig_team1,ig_team2benefit,ig_game_type,
RANK() OVER(partition by ig_root,ig_game_type order by ig_idx asc) AS rank
FROM  info_game ) AS t1
WHERE rank < 2)

MERGE 
Info_Game AS t 
USING (

select *
       ,count(name) over(partition by name) count
from cte_example

) s

ON t.ig_outcome_id = s.ig_idx 
WHEN MATCHED  THEN
UPDATE SET 
s.IG_Team1Benefit = t.pv_v1,
s.ig_drawbenefit = t.pv_v2,
s.IG_Team2Benefit = t.pv_v3
WHEN NOT MATCHED THEN
INSERT 
(ig_idx,ig_team1,ig_team2benefit,ig_game_type) 
VALUES 
(s.ig_idx,s.ig_team1,s.ig_team2benefit,s.ig_game_type)
OUTPUT $action, Inserted.*, Deleted.*;

【讨论】:

    【解决方案2】:
    ;with cte_example 
    as
    (SELECT ig_idx,ig_team1,ig_team2benefit,ig_game_type
    FROM (select ig_idx,ig_team1,ig_team2benefit,ig_game_type,
    RANK() OVER(partition by ig_root,ig_game_type order by ig_idx asc) AS rank
    FROM  info_game ) AS t1
    WHERE rank < 2)
    MERGE 
    Info_Game AS t 
    USING (
    select *
           ,count(name) over(partition by name) count
    from cte_example
    
    ) s
    
    ON t.ig_outcome_id = s.ig_idx 
    WHEN MATCHED  THEN
    UPDATE SET 
    s.IG_Team1Benefit = t.pv_v1,
    s.ig_drawbenefit = t.pv_v2,
    s.IG_Team2Benefit = t.pv_v3
    WHEN NOT MATCHED THEN
    INSERT 
    (ig_idx,ig_team1,ig_team2benefit,ig_game_type) 
    VALUES 
    (s.ig_idx,s.ig_team1,s.ig_team2benefit,s.ig_game_type)
    

    【讨论】:

      猜你喜欢
      • 2020-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-28
      • 1970-01-01
      • 1970-01-01
      • 2019-12-05
      相关资源
      最近更新 更多