在 CTE 中创建 table

create a table within a CTE

我想要一个可以玩的table,但可以作为整体 CTE 的参考


    CTE_MONTHS as (
   DECLARE @MONTHS TABLE ([NUMBER] int, NAME varchar(max))
   INSERT INTO @MONTHS
   select ([NUMBER],[NAME]) VALUES
   ('1' ,'JANUARY')
   ,('2' ,'FEBRUARY')
   ,('3' ,'MARCH')
   ,('4' ,'APRIL')
   ,('5' ,'MAY')
   ,('6' ,'JUNE')
   ,('7' ,'JULY')
   ,('8' ,'AUGUST')
   ,('9' ,'SEPTEMBER')
   ,('10','OCTOBER')
   ,('11','NOVEMBER')
   ,('12','DECEMBER')
   select * from @MONTHS
   )

主要问题是你的顺序全错了。试试这个:

   DECLARE @MONTHS TABLE ([NUMBER] int, NAME varchar(max));

   WITH CTE_MONTHS AS 
   (
        SELECT [NUMBER], [NAME] 
        FROM (VALUES ('1' ,'JANUARY')
                    ,('2' ,'FEBRUARY')
                    ,('3' ,'MARCH')
                    ,('4' ,'APRIL')
                    ,('5' ,'MAY')
                    ,('6' ,'JUNE')
                    ,('7' ,'JULY')
                    ,('8' ,'AUGUST')
                    ,('9' ,'SEPTEMBER')
                    ,('10','OCTOBER')
                    ,('11','NOVEMBER')
                    ,('12','DECEMBER')) AS m([NUMBER], [NAME])
   )
   INSERT INTO @MONTHS ([NUMBER], [NAME])
   SELECT [NUMBER],[NAME] FROM CTE_MONTHS;

   SELECT * FROM @MONTHS;

不过在这种情况下,CTE 什么也没做。你不妨这样写:

   DECLARE @MONTHS TABLE ([NUMBER] int, NAME varchar(max));

   INSERT INTO @MONTHS ([NUMBER], [NAME])
   SELECT [NUMBER], [NAME] 
   FROM (VALUES ('1' ,'JANUARY')
               ,('2' ,'FEBRUARY')
               ,('3' ,'MARCH')
               ,('4' ,'APRIL')
               ,('5' ,'MAY')
               ,('6' ,'JUNE')
               ,('7' ,'JULY')
               ,('8' ,'AUGUST')
               ,('9' ,'SEPTEMBER')
               ,('10','OCTOBER')
               ,('11','NOVEMBER')
               ,('12','DECEMBER')) AS m([NUMBER], [NAME]);

   SELECT * FROM @MONTHS;

我想我之前没说清楚,但我不是想做临时工table。我想避免任何插入或任何 table 创作(即使它是临时的。)

我有类似下面的内容...我希望能够在按 F5 之前更改 CTE_MONTHS 脚本中的值。因此,例如,也许我希望 9 成为二月,然后 运行 查询。


WITH CTE_DATA as
 (select distinct
 MONTH(Effective_Date) as MONTH_NUM,
 DATENAME(MONTH, Effective_date) as MONTH_NAME,
 ACTIVE_DATE,
 INACTIVE_DATE,
 TN,
 MARKET_NPAS
 FROM SEP19TN2
 WHERE [LRN] <> 'Y _OOL' and MONTH(Effective_Date) is not null),

CTE_MONTHS as (
 --DECLARE MONTHS TABLE ([NUMBER] int, NAME varchar(max))
 --INSERT INTO MONTHS
 select ([NUMBER],[NAME]) VALUES
 ('1' ,'JANUARY'  )
 ,('2' ,'FEBRUARY' )
 ,('3' ,'MARCH'   )
 ,('4' ,'APRIL'   )
 ,('5' ,'MAY'     )
 ,('6' ,'JUNE'    )
 ,('7' ,'JULY'    )
 ,('8' ,'AUGUST')
 ,('9' ,'SEPTEMBER')
 ,('10','OCTOBER')
 ,('11','NOVEMBER')
 ,('12','DECEMBER')
 --select * from @MONTHS
 ) 

and here goes some kind of query that references both CTEs


 ***

在那种情况下,我真的看不出问题所在。您只需使用这样的代码:

WITH CTE_DATA 
AS
(
    SELECT DISTINCT MONTH(Effective_Date) as MONTH_NUM,
                    DATENAME(MONTH, Effective_date) as MONTH_NAME,
                    ACTIVE_DATE,
                    INACTIVE_DATE,
                    TN,
                    MARKET_NPAS
   FROM SEP19TN2
   WHERE [LRN] <> 'Y _OOL' 
   AND MONTH(Effective_Date) IS NOT NULL
),
CTE_MONTHS AS 
(
     SELECT [NUMBER], [NAME] 
     FROM (VALUES ('1' ,'JANUARY')
                 ,('2' ,'FEBRUARY')
                 ,('3' ,'MARCH')
                 ,('4' ,'APRIL')
                 ,('5' ,'MAY')
                 ,('6' ,'JUNE')
                 ,('7' ,'JULY')
                 ,('8' ,'AUGUST')
                 ,('9' ,'SEPTEMBER')
                 ,('10','OCTOBER')
                 ,('11','NOVEMBER')
                 ,('12','DECEMBER')) AS m([NUMBER], [NAME])
)
-- and main query goes here - it can reference both CTEs

附带说明一下,尝试根据它们所包含的内容来命名事物,而不是它们的实现方式。在表达式前面加上CTE_,确实没有任何价值。