2017-10-11 12 views
0

SQL Server에서 MERGE을 사용하는 데 문제가 있습니다.SQL Server에서 MERGE 사용 2014

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

하지만

메시지 (156)

cte_example에 오류가 발생, 레벨 나는이 작업을 수행 할 수있는 방법 15

?

+1

공용 테이블 식을 병합 문 외부에 배치하십시오. – Mokadillion

답변

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

Cte는 병합 문 안에 있으면 안됩니다. 그것을 밖으로 이동하십시오.

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