gpt4 book ai didi

sql - 如何在SQL中使用 "With"子句创建表

转载 作者:行者123 更新时间:2023-12-01 11:21:09 25 4
gpt4 key购买 nike

我正在尝试使用 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;

但是,我收到一个错误

Msg 319, Level 15, State 1, Line 5 Incorrect syntax near the keyword 'with'. If this statement is a common table expression, an xmlnamespaces clause or a change tracking context clause, the previous statement must be terminated with a semicolon.



我的代码是
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;
)

任何人都可以就此提供一些指导吗?

提前谢谢了!

最佳答案

这不是 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;

此选项仅在此批次中持续存在,不需要删除 - 就像任何其他变量一样。

关于sql - 如何在SQL中使用 "With"子句创建表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42907758/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com