在 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_,确实没有任何价值。
我想要一个可以玩的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_,确实没有任何价值。