Ted Jang
Ted Jang

Reputation: 55

Using MERGE in SQL Server 2014

I have a problem using MERGE in SQL Server.

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.*;

but I get an error in WITH cte_example

Msg 156, Level 15

How can I do this?

Upvotes: 0

Views: 634

Answers (2)

AB_87
AB_87

Reputation: 1156

Cte should not be inside Merge statement. Move it out.

;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.*;

Upvotes: 0

Stanislav Kundii
Stanislav Kundii

Reputation: 2894

;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)

Upvotes: 1

Related Questions