我搜索但无法在SQL Server 2005/2008中为新手找到一个好的临时表使用教程.我想学习临时表与普通表的比较,它的生命周期和临时表的共享方式(在同一个会话中,交叉会话)?
乔治,提前谢谢
这是一些示例代码:
if object_id('tempdb..#TempList') is not null drop table #TempList
create table #TempList (
ID int,
Name varchar(20)
)
insert into #TempList values (1, 'Alpha')
insert into #TempList values (2, 'Beta')
insert into #TempList values (3, 'Gamma')
insert into #TempList values (4, 'Delta')
insert into #TempList values (5, 'Omega')
select * from #TempList
if object_id('tempdb..#TempList') is not null drop table #TempList
drop table #TempList
create table #TempList (
ID_New int,
AnotherID int,
Name_New varchar(40)
)
insert into #TempList values (100, 110, …Run Code Online (Sandbox Code Playgroud) 我们有一所拥有38所小学的学区.孩子们参加了考试.学校的平均分布很广,但我想比较每所学校的10名学生的平均分.
要求:仅使用临时表.
我这样做的工作量非常大,容易出错,如下所示.
(sch_code = eg,9043; - schabbrev = eg,"Carter"; - totpct_stu = eg,61.3)
DROP TEMPORARY TABLE IF EXISTS avg_top10 ;
CREATE TEMPORARY TABLE avg_top10
( sch_code VARCHAR(4),
schabbrev VARCHAR(75),
totpct_stu DECIMAL(5,1)
);
INSERT
INTO avg_top10
SELECT sch_code
, schabbrev
, totpct_stu
FROM test_table
WHERE sch_code IN ('5489')
ORDER
BY totpct_stu DESC
LIMIT 10;
-- I do that last query for EVERY school, so the total
-- length of the code is well in excess of 300 lines.
-- Then, …Run Code Online (Sandbox Code Playgroud) 使用临时表的主要目的是什么?我想知道在小型和大型公司工作的实际软件中临时表的实际和商业用途.
如何在Rails 3中执行以下操作?
CREATE TEMPORARY TABLE average_user_total_time
(SELECT SUM(time) AS time_taken
FROM scores
WHERE created_at >= '2010-10-10'
and created_at <= '2010-11-11'
GROUP BY user_id);
SELECT COUNT(*) from average_user_total_time WHERE time_taken > 60 and time_taken < 600
Run Code Online (Sandbox Code Playgroud)
我试过做类似的事情
create_table (:average_user_total_time), :temporary=> true do |t|
end
Run Code Online (Sandbox Code Playgroud)
但不确定如何正确使用它.我需要在我的应用程序中使用它,而不是在迁移中.
出于调试目的,我希望能够" TO_CHAR"一个Oracle PL/SQL内存表.这是一个简单的例子,我想做的事情:
DECLARE
TYPE T IS TABLE OF MY_TABLE%ROWTYPE INDEX BY PLS_INTEGER;
V T;
BEGIN
-- ..
-- Here, I'd like to dbms_output V's contents, which of course doesn't compile
FOR i IN V.FIRST .. V.LAST LOOP
dbms_output.put_line(V(i));
END LOOP;
-- I want to omit doing this:
FOR i IN V.FIRST .. V.LAST LOOP
dbms_output.put_line(V(i).ID || ',' || V(i).AMOUNT ...);
END LOOP;
END;
Run Code Online (Sandbox Code Playgroud)
简单来说,这可以实现吗?我问的原因是因为我懒得一次又一次地编写这个调试代码,而且我想在任何表类型中使用它.
我已经读过,在会话表中,数据在提交过程中仍然存在.用Ask Tom的话来说.
ON COMMIT PRESERVE ROWS使这成为一个基于会话的临时表.在注销之前,行将保留在此表中.只有我可以看到它们,即使我提交后也没有其他会话会看到"我的"行
这里的问题短语是"直到注销".以Web应用程序为例,该应用程序与DB保持单一连接.因此,这意味着登录到Web应用程序的所有用户将共享相同的数据库会话.那么,这是否意味着所有用户都将在该临时表中看到相同的内容?
在实际的Web应用程序中,我们通常会维护多个DB连接.这些连接保存在"池"中,并且可以为许多用户重用它们.在这种情况下,行为可能非常不稳定,用户可能会查看上一个用户填充的数据.
我喜欢在MySQL中加入一个临时表失败,这个想法很简单:
CREATE TEMPORARY TABLE temp_table LIKE any_other_table; -- srsly it does not matter which table
(
SELECT p1,p2,p3 FROM temp_table WHERE p4 = 1
) UNION (
SELECT p1,p2,p3 FROM temp_table WHERE p4 = 2
)
Run Code Online (Sandbox Code Playgroud)
任何帮助是极大的赞赏.
编辑:mysql抛出的错误是 ERROR 1137 (HY000): Can't reopen table: 'temp_table'
我想知道,这两个脚本有什么区别?
SELECT * FROM ##TEMP
Run Code Online (Sandbox Code Playgroud)
还有这个
SELECT * FROM #TEMP
Run Code Online (Sandbox Code Playgroud) 我想在MySQL存储过程中创建具有随机名称的临时表.我还需要存储名称,以便从另一个存储过程访问该表.我在考虑使用MD5哈希:
SELECT md5(RAND()+CURRENT_TIMESTAMP());
Run Code Online (Sandbox Code Playgroud)
我想知道这是否会产生完全无碰撞的字符串?
temp-tables ×10
sql ×6
mysql ×3
sql-server ×3
oracle ×2
activerecord ×1
join ×1
limit ×1
plsql ×1
random ×1
t-sql ×1
tostring ×1