1

我最近一直在研究 SQL 并进行了一些探索。关于临时表,我发现了 3 种不同的临时表类型:

1)创建表#TempTable

2)声明表@TempTable

3) SELECT * FROM (SELECT * FROM Customers) AS TempTable

现在我了解了#TempTable 和@TempTable 类型背后的范围,但是如示例3 中的派生表呢?这个派生表存储在哪里?如果它在 1 个事务中声明,第二个事务可以访问它,还是派生表的范围与示例 1 和 2 相同?

4

2 回答 2

6

1) CREATE TABLE #TempTable --local 临时表

本地临时表仅在当前会话中可见,并且可以在嵌套存储过程调用之间共享:http: //www.sommarskog.se/share_data.html#temptables

2) DECLARE TABLE @TempTable --local 表变量

局部变量的范围是声明它的批处理、存储过程或语句块。它们可以作为过程之间的参数传递。它们不受事务的影响,并且将在回滚后保留所有行。

3) SELECT * FROM (SELECT * FROM Customers) AS TempTable --派生表

仅对当前查询可见

4) CREATE TABLE ##TempTable --global 临时表

这与 #temp 表的不同之处在于它对所有进程都是可见的。当创建过程结束时,表被删除(但会等到其他进程的任何当前活动完成)。

5) CTE——公用表表达式

示例 CTE:

;WITH YourBigCTE AS
(
    big query here

)
SELECT * FROM YourTable1  WHERE ID IN (SELECT ID FROM YourBigCTE)
UNION 
SELECT * FROM YourTable2  WHERE ID IN (SELECT ID FROM YourBigCTE)

可以在同一个 CTE 命令中多次使用,甚至可以递归使用,并且将在 CTE 命令的持续时间内持续使用。

于 2010-05-12T12:31:04.290 回答
1

这取决于您使用的实际 RDBMS - 我将假设 Sybase 或 SQL Server(但可能对所有人都适用)

SELECT * FROM (SELECT * FROM Customers) AS TempTable

Temptable 仅适用于当前 SQL 语句,即仅适用于 select。

SELECT * FROM Customers into tempdb..TempTable

将在 tempdb 中创建一个新表,必须显式删除该表

于 2010-05-12T09:10:58.230 回答