我正在尝试使用WITH子句创建持久表,但是,我收到了一个错误。
对于上下文,我目前找到的答案是
CREATE TABLE my_table
AS
WITH my_tables_data AS (
SELECT another_table.data1 AS some_value
FROM another_table
)
SELECT *
FROM some_data;
然而,我收到错误
消息319,级别15,状态1,行5关键字附近的语法不正确 “用”。如果此语句是公用表表达式,则为 xmlnamespaces子句或更改跟踪上下文子句,前一个 声明必须以分号结束。
我的代码是
CREATE TABLE SalesOrdersPerYear
WITH t1 AS (
-- Define the CTE expression name and column list.
WITH Sales_CTE (SalesPersonID, BaseSalary)
AS
-- Define the CTE query.
(
SELECT SALES_PERSON.SALES_PERSON_ID, SALES_PERSON.BASE_SALARY
FROM SALES_PERSON
WHERE SALES_PERSON_ID IS NOT NULL
)
-- Define the outer query referencing the CTE name.
SELECT SalesPersonID, BaseSalary AS TotalSales
FROM Sales_CTE
ORDER BY SalesPersonID, BaseSalary;
)
有人能够就此提供一些指导吗?
非常感谢提前!
答案 0 :(得分:3)
这不是sql server的有效语法。您可以使用CREATE TABLE
创建表并指定列名称和类型,也可以执行包含数据的SELECT INTO
语句。
方法1:创建表格,然后填充:
CREATE TABLE SalesOrdersPerYear
( SalesPersonID int, BaseSalary float)
;
WITH Sales_CTE (SalesPersonID, BaseSalary)
AS
(
SELECT SALES_PERSON.SALES_PERSON_ID, SALES_PERSON.BASE_SALARY
FROM SALES_PERSON
WHERE SALES_PERSON_ID IS NOT NULL
)
insert into SalesOrdersPerYear
SELECT SalesPersonID, BaseSalary AS TotalSales
FROM Sales_CTE
ORDER BY SalesPersonID, BaseSalary;
方法2 - 一步到位
WITH Sales_CTE (SalesPersonID, BaseSalary)
AS
(
SELECT SALES_PERSON.SALES_PERSON_ID, SALES_PERSON.BASE_SALARY
FROM SALES_PERSON
WHERE SALES_PERSON_ID IS NOT NULL
)
select SalesPersonID, BaseSalary AS TotalSales
into SalesOrdersPerYear
FROM Sales_CTE
ORDER BY SalesPersonID, BaseSalary;
当您需要指定有关表的更多信息时,请使用方法1(主键,索引,外键等。
对于更临时的事情,使用方法2。 (你通常会在这里使用临时表,例如#SalesOrdersPerYear。)
无论哪种方式,数据现在都存储在您的表中,您可以再次使用它。
使用临时表:
-- Check for existence and drop first to avoid errors if it already exists.
if OBJECT_ID('tempdb..#SalesOrdersPerYear') is not null
drop table #SalesOrdersPerYear
WITH Sales_CTE (SalesPersonID, BaseSalary)
AS
(
SELECT SALES_PERSON.SALES_PERSON_ID, SALES_PERSON.BASE_SALARY
FROM SALES_PERSON
WHERE SALES_PERSON_ID IS NOT NULL
)
select SalesPersonID, BaseSalary AS TotalSales
into #SalesOrdersPerYear
FROM Sales_CTE
ORDER BY SalesPersonID, BaseSalary;
您还可以将其定义为表变量,这是方法之间的交叉点:
declare @SalesOrdersPerYear table
( SalesPersonID int, BaseSalary float)
;
WITH Sales_CTE (SalesPersonID, BaseSalary)
AS
(
SELECT SALES_PERSON.SALES_PERSON_ID, SALES_PERSON.BASE_SALARY
FROM SALES_PERSON
WHERE SALES_PERSON_ID IS NOT NULL
)
insert into @SalesOrdersPerYear
SELECT SalesPersonID, BaseSalary AS TotalSales
FROM Sales_CTE
ORDER BY SalesPersonID, BaseSalary;
此选项仅在此批次中保留,并且不需要删除 - 就像任何其他变量一样。
答案 1 :(得分:-1)
CREATE VIEW AS my_view
AS
WITH my_tables_data AS (
SELECT another_table.data1 AS some_value
FROM another_table
)
SELECT *
FROM some_data;
CREATE TABLE my_table AS
SELECT * FROM my_view;