我正在尝试转换一些大型数据集,我发现最优化的方法是用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表?
代码示例:
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发布于 2019-12-14 05:40:21
之所以不能在CTE之后使用CREATE TABLE语句,是因为CTE是SELECT指令的一部分。这对'SELECT * from table DELETE TABLE2'来说是没有意义的。它必须是两条单独的指令。
为什么要在表中先删除再创建,然后再插入?您可以将数据直接插入到新的表中,这将只是一条指令。请参阅:SQL Server SELECT into existing table
如果想要重新运行脚本,可以在执行插入之前截断表,就像Belayer在注释中所说的那样
https://stackoverflow.com/questions/59326118
复制相似问题