我最近一直在研究SQL并进行一些探索。关于临时表我发现了3种不同的临时表类型:
1)CREATE TABLE #TempTable
2)DECLARE TABLE @TempTable
3)SELECT * FROM(SELECT * FROM Customers)AS TempTable
现在我理解了#TempTable和@TempTable类型背后的范围,但是如例3中的派生表呢?这个派生表存储在哪里?如果它在1个事务中声明,第二个事务是否可以访问它,或者是与示例1和2相同的派生表的范围?
答案 0 :(得分:6)
1)CREATE TABLE #TempTable - 本地临时表
本地临时表仅在当前会话中可见,并且可以在嵌套存储过程调用之间共享:http://www.sommarskog.se/share_data.html#temptables
2)DECLARE TABLE @TempTable --local table variable
局部变量的范围是声明它的批处理,存储过程或语句块。它们可以作为过程之间的参数传递。它们不受事务处理,并且会在回滚后保留所有行。
3)SELECT * FROM(SELECT * FROM Customers)AS TempTable - 派生表
仅对当前查询可见
4)CREATE TABLE ## TempTable --global temp table
这与#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命令的持续时间。
答案 1 :(得分:1)
这取决于您使用的实际RDBMS - 我将假设Sybase或SQL Server(但可能适用于所有人)
SELECT * FROM (SELECT * FROM Customers) AS TempTable
Temptable仅适用于当前的SQL语句,即只有select。
SELECT * FROM Customers into tempdb..TempTable
会在tempdb中创建一个新表格,必须明确删除