Utiliser un CTE qui appelle un autre CTE – Syntaxe incorrecte proche;

J'essaie de créer un CTE qui appelle un autre CTE comme suit. Mais j'ai cette erreur:

Msg 102, niveau 15, état 1, ligne 54 Syntaxe incorrecte près de ';'.

Je ne peux pas vraiment voir quel est le problème. J'ai vérifié un tas d'autres questions similaires à la mienne et essayé la solution à partir de ceux-ci, mais cela ne fonctionnera pas pour une raison quelconque.

With SEASONALITY_AVG_REVENUE ( YearKey ,Aggregation_Key ,Yearly_Avg_Revenue ) as ( SELECT ts.YearKey, agg.Aggregation_Key, Yearly_Avg_Revenue = AVG(agg.Revenue) FROM seasonality_custom.TIME_SERIES_INDEX ts INNER JOIN seasonality_custom.SEASONALITY_AGG_TIME_SERIES agg ON ts.TIME_SERIES_INDEX = agg.TIME_SERIES_INDEX GROUP BY ts.YearKey, agg.Aggregation_Key ) , SEASONALITY_ALL_RECS ( YearKey ,Aggregation_Key ,Revenue ,Yearly_Avg_Revenue ) as ( SELECT ts.YearKey, agg.Aggregation_Key, agg.Revenue, Yearly_Avg_Revenue = savg.Yearly_Avg_Revenue FROM seasonality_custom.TIME_SERIES_INDEX ts INNER JOIN seasonality_custom.SEASONALITY_AGG_TIME_SERIES agg ON ts.TIME_SERIES_INDEX = agg.TIME_SERIES_INDEX INNER JOIN SEASONALITY_AVG_REVENUE savg ON ts.YearKey = savg.YearKey and agg.Aggregation_Key = savg.Aggregation_Key ); 

Vous ne pouvez pas avoir with instruction with sauf si vous le suivez par une autre instruction, généralement select mais dans de nombreuses bases de données, update et delete également.

Votre instruction a plusieurs CTE, mais elle n'a pas la partie de requête principale. L'erreur est sur le point-virgule car cela met fin à la requête.

Vous avez vraiment besoin d'un CTE ici

 ; With SEASONALITY_AVG_REVENUE(YearKey, Aggregation_Key, Yearly_Avg_Revenue) AS ( SELECT ts.YearKey, agg.Aggregation_Key, Yearly_Avg_Revenue = AVG(agg.Revenue) FROM seasonality_custom.TIME_SERIES_INDEX ts INNER JOIN seasonality_custom.SEASONALITY_AGG_TIME_SERIES agg ON ts.TIME_SERIES_INDEX = agg.TIME_SERIES_INDEX GROUP BY ts.YearKey, agg.Aggregation_Key ) SELECT ts.YearKey, agg.Aggregation_Key, agg.Revenue, Yearly_Avg_Revenue = savg.Yearly_Avg_Revenue FROM seasonality_custom.TIME_SERIES_INDEX ts INNER JOIN seasonality_custom.SEASONALITY_AGG_TIME_SERIES agg ON ts.TIME_SERIES_INDEX = agg.TIME_SERIES_INDEX INNER JOIN SEASONALITY_AVG_REVENUE savg ON ts.YearKey = savg.YearKey and agg.Aggregation_Key = savg.Aggregation_Key 

Ou

Comme Gordon l'a mentionné, le CTE doit être suivi d'une instruction SELECT, UPDATE, DELETE.

Avec votre requête en cours, vous pouvez simplement sélectionner à la fin de votre deuxième CTE et il returnnera également les mêmes résultats, mais ce sera une étape inutile. Quelque chose comme ça..

 ;WITH CTE1 (Col1, Col2) AS ( -- Some code here ), CTE2 AS ( -- Some code here ) SELECT * FROM CTE2