我最近一直在研究 SQL 并进行了一些探索。关于临时表,我发现了 3 种不同的临时表类型:
1)创建表#TempTable
2)声明表@TempTable
3) SELECT * FROM (SELECT * FROM Customers) AS TempTable
现在我了解了#TempTable 和@TempTable 类型背后的范围,但是如示例3 中的派生表呢?这个派生表存储在哪里?如果它在 1 个事务中声明,第二个事务可以访问它,还是派生表的范围与示例 1 和 2 相同?
我最近一直在研究 SQL 并进行了一些探索。关于临时表,我发现了 3 种不同的临时表类型:
1)创建表#TempTable
2)声明表@TempTable
3) SELECT * FROM (SELECT * FROM Customers) AS TempTable
现在我了解了#TempTable 和@TempTable 类型背后的范围,但是如示例3 中的派生表呢?这个派生表存储在哪里?如果它在 1 个事务中声明,第二个事务可以访问它,还是派生表的范围与示例 1 和 2 相同?
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 命令的持续时间内持续使用。
这取决于您使用的实际 RDBMS - 我将假设 Sybase 或 SQL Server(但可能对所有人都适用)
SELECT * FROM (SELECT * FROM Customers) AS TempTable
Temptable 仅适用于当前 SQL 语句,即仅适用于 select。
SELECT * FROM Customers into tempdb..TempTable
将在 tempdb 中创建一个新表,必须显式删除该表