首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将With CTE与CREATE/INSERT顺序一起使用

将With CTE与CREATE/INSERT顺序一起使用
EN

Stack Overflow用户
提问于 2019-12-14 00:08:33
回答 1查看 252关注 0票数 0

我正在尝试转换一些大型数据集,我发现最优化的方法是用Oracle编写CTE。在性能方面,我发现这与本文(https://www.mssqltips.com/sqlservertip/5118/sql-server-cte-vs-temp-table-vs-table-variable-performance-test/)的发现非常接近。

然而,问题是,还有一些表需要通过这个过程以顺序的方式创建。然而,我发现虽然我可以使用CTE创建表,但我不能在CTE之后使用create TABLE语句,只能在CTE之前使用。

我发现下面的方法是可行的。但是由于某些原因,我不得不一次运行一条DROP TABLE和CREATE TABLE语句。有没有办法修改下面的代码,使我只需运行一次脚本就可以同时更新tmp和tmp2表?

代码示例:

代码语言:javascript
复制
DROP TABLE tmp PURGE; 
DROP TABLE tmp2 PURGE; 

CREATE TABLE tmp ( tmp_id NUMBER(10));  
CREATE TABLE tmp2 ( tmp_id NUMBER(10));

/* Part I - Insert the first table using WITH CTE */
INSERT INTO tmp( tmp_id )
WITH cte AS (
  SELECT 1 AS tmp_id FROM dual union all
  SELECT 2 AS tmp_id FROM dual
)
SELECT tmp_id
FROM cte;

/* Part II- Use tmp table created above in another CTE*/
INSERT INTO tmp2( tmp_id )
WITH cte AS (
  SELECT tmp_id from tmp
)
SELECT tmp_id
FROM cte;

--/*Just for testing*/ select * from tmp
--/*Just for testing*/ select * from tmp2
EN

回答 1

Stack Overflow用户

发布于 2019-12-14 05:40:21

之所以不能在CTE之后使用CREATE TABLE语句,是因为CTE是SELECT指令的一部分。这对'SELECT * from table DELETE TABLE2'来说是没有意义的。它必须是两条单独的指令。

为什么要在表中先删除再创建,然后再插入?您可以将数据直接插入到新的表中,这将只是一条指令。请参阅:SQL Server SELECT into existing table

如果想要重新运行脚本,可以在执行插入之前截断表,就像Belayer在注释中所说的那样

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59326118

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档