子将查询结果放入临时表2千万条数据是否该插入到临时表

1.什么是子查询?当一个查询是另一个查询的条件时,称之为子查询。子查询可以使用几个简单命令构造功能强大的复合命令。子查询最常用于SELECT-SQL命令的WHERE子句中。子查询是一个 SELECT 语句,它嵌套在一个 SELECT、SELECT...INTO 语句、INSERT...INTO 语句、DELETE 语句、或 UPDATE 语句或嵌套在另一子查询中。语法:select ....from& 表1& where& 列1&&& (子查询)&&&&&&& 外面的查询成为父查询,圆括号嵌入的查询成为称为子查询。SQL& Server& 执行时,先执行子查询部分,求出子查询部分的值,再执行整个父查询,返回最后的结果。&&&&&&&&查看多表的数据也可使用表连接,表连接(join&& on...),表连接都可用子查询替换,但有的子查询不能用表连接替换,子查询比较灵活,方便,形式多样,适合于作为查询的筛选条件。例如:&&&&结果为:2.In 和& Not& In子查询1&如果你的子查询将返回多个数据行,你可以用IN和NOT IN操作符来构造主查询的检索条件。IN和NOT IN操作符的用途是测试一个给定的比较值有没有出现在一个特定的集合里。只要主查询里的数据行与子查询所返回的任何一个数据行匹配,IN操作符的比较结果就将是true。如果主查询里的数据行与子查询所返回的所有数据行都不匹配,NOT IN操作符的比较结果将是true。例如:SELECT&*&FROM&student&&WHERE&student_id&IN&(SELECT&student_id&FROM&absence); &&&&&&&&&name&&|&sex&|&student_id&|&&&&&&&&&&& +-------+-----+------------+&&&&&&&&&&& |&Kyle&&|&M&&&|&&&&&&&&&&3&|&&&&&&&&&&& |&Abby&&|&F&&&|&&&&&&&&&&5&|&&&&2&IN和NOT IN操作符还可以用在将返回多个数据列的子查询里。换句话说,你可以在数据表子查询里使用它们。此时,你需要使用一个数据行构造器来给出将与各数据列比较的比较值。例如:SELECT&last_name,&first_name,&city,&state&FROM&president&&WHERE&(city,&state)&IN&&(SELECT&city,&state&FROM&president&&WHERE&last_name&=&'Roosevelt');&&&&&&&&&&&&& &+-----------+-------------+-----------+-------+&&&&&&&&&&&&&&& |&last_name&|&first_name&&|&city&&&&&&|&state&|&&&&&&&&&&&&&&&&+-----------+-------------+-----------+-------+&&&&&&&&&&&&&&& |&Roosevelt&|&Theodore&&&&|&New&York&&|&NY&&&&|&&&&&&&&&&&&&&& |&Roosevelt&|&Franklin&D.&|&Hyde&Park&|&NY&&&&|&&&&&&&&&&&&&& &+-----------+-------------+-----------+-------+&&3.Exists&和 Not Exists 子查询Exists可以检测数据是否存在。如果子查询的结果非空,则Exists(子查询)将返回真(true),否则返回假(false)。If& Exists (子查询)&&& 语句Exists&&和 In 一样,同样允许添加Not关键字实现取反操作,Not Exists 表示不存在。4.子查询的注意事项&1&使用子查询的原则&1.一个子查询必须放在圆括号中。&2.将子查询放在比较条件的右边以增加可读性。&子查询不包含 ORDER BY 子句。对一个 SELECT 语句只能用一个 ORDER BY 子句,并且如果指定了它就必须放在主 SELECT 语句的最后。ORDER BY 子句可以使用,并且在进行 Top-N 分析时是必须的。&3.在子查询中可以使用两种比较条件:单行运算符和多行运算符。&&2&子查询的类型&单行子查询:从内 SELECT 语句只返回一行的查询&多行子查询:从内 SELECT 语句返回多行的查询&&3&单行子查询&单行子查询是从内查询返回一行的查询。在该子查询类型中用一个单行操作符。幻灯片中列出了单行操作符。5.查询的方法:&1&联合:合并多个数据集中的行&& &2&子查询:将一个查询嵌套在另一个查询中&&& &3&连接:合并多个数据表中的列6.什么是相关子查询?相关子查询依赖于外部查询。外部查询和SQL Server子查询是有联系的,尤其在子查询的WHERE语句中更是如此。相关子查询的工作方式是:在子查询中找到外部查询的参考时执行外部查询,此时将结果返回给子查询。然后在外部查询返回的结果集上执行子查询操作。相关子查询的执行性能:由于相关子查询中的子查询在外部查询返回的结果集上进行执行,其效率肯定下降。子查询的性能完全依赖于查询和有关的数据。但是,如果相关子查询的语句写得很有效率,则其执行性能能够胜过那些使用几个连接和临时表的程序。&
、 、 、 、 、数据库管理员社区
Mysql_嵌套表查询_查询结果作为子表(临时表)
此功能同Oracle一样!
&&& 许多人都觉得MySQL不支持嵌套查询,其实MySQl从4.11版后已经完全支持嵌套查询了,那么下面我举些简单的嵌套查询的例子吧(源程序来自MySQL User Manual): &&& 1. SELECT语句的子查询: &&& 语法: (注意:AS 可省略)
SELECT ... FROM (subquery) AS
tableName ...
&&& 先创建一个表:
CREATE TABLE t1 (s1 INT, s2 CHAR(5), s3 FLOAT); INSERT INTO t1 VALUES (1,'1',1.0); INSERT INTO t1 VALUES (2,'2',2.0);
&&& 我们就可以进行以下的嵌套查询了:
SELECT sb1,sb2,sb3 & && & FROM (SELECT s1 AS sb1, s2 AS sb2, s3*2 AS sb3 FROM t1) AS sb & && & WHERE sb1 & 1;
&&& 结果是: 2, '2', 4.0. &&& 我们知道下面语句是不会得到正确结果的,因为对经过Group by排序的集合进行求均值是不能得到正确答案的:
SELECT AVG(SUM(column1)) FROM t1 GROUP BY column1
&&& 所以我们可以通过下面的嵌套查询实现同样的效果:
SELECT AVG(sum_column1) & && & FROM (SELECT SUM(column1) AS sum_column1 & && && && & FROM t1 GROUP BY column1) AS t1;
&&& 2.行的子查询(Row Subquery): &&& 看下面的例子:
SELECT * FROM t1 WHERE ROW(1,2) = (SELECT column1, column2 FROM t2);
&&& 这个查询是返回column1等于column2的结果行。Row函数中的1和2相当于构造参数。想必Blogjava上的同志对这些应该比较清楚,也不去详细介绍了。 &&& 3.使用Exist和Not Exist参数 &&& 这里的Exist和Not Exist用途及用法和在其他没有什么大的区别,我就简单举几个范例好了: &&& 范例一:
SELECT DISTINCT store_type FROM Stores & && && && && && &&&WHERE EXISTS (SELECT * FROM Cities_Stores & && && && && && && && && && && & WHERE Cities_Stores.store_type = Stores.store_type);
&&& 范例二:
SELECT DISTINCT store_type FROM Stores & && && && && && && &&&WHERE NOT EXISTS (SELECT * FROM Cities_Stores & && && && && && && && && && && &&&WHERE Cities_Stores.store_type = Stores.store_type);
&&& 范例三:&&这个例子中嵌套使用了Not Exist语法,稍微注意一下:
& && && && && &SELECT DISTINCT store_type FROM Stores S1 & && && && && && &&&WHERE NOT EXISTS ( & && && && && && && && && && & SELECT * FROM Cities WHERE NOT EXISTS ( & && && && && && && && && && && && && &SELECT * FROM Cities_Stores & && && && && && && && && && && && && && && && & WHERE Cities_Stores.city = Cities.city & && && && && && && && && && && && && && && && && && && &AND Cities_Stores.store_type = Stores.store_type));
&&& 4.条件关联关系查询: &&& 解释起来麻烦,直接看例子吧:
SELECT column1 FROM t1 AS x & &&&WHERE x.column1 = (SELECT column1 FROM t2 AS x & && && & WHERE x.column1 = (SELECT column1 FROM t3 & && && && && &WHERE x.column2 = t3.column1));
&&& 跟其他数据库做法是一样的。 &&& 5.其他使用方法和注意: 除了上面这些还有很多很多,不过就不去细讲了,因为这些跟别的数据库差不多,只是为了给大家一个参考,提提就够了。
& && && &SELECT (SELECT s1 FROM t2) FROM t1; & && && &SELECT (SELECT s2 FROM t1);
&&& 注意:
&&&&&&&&&&& #1 这种用法是把select的结果“值”作为“字段值”使用
&&&&&&&&&&& #2 select “aValue” from tableX; //其实是从表中选择这个值与表行数关联 &&& 支持子查询的语法有:SELECT,INSERT,UPDATE,DELETE,SET和DO。 &&& 子查询可以使用任何普通查询中使用的关键词:如DINSTINCT,GROUP BY,LIMIT,ORDER BY,UNION,ALL,UNION ALL等。可以使用&,&, &=, &=, =, &&运算符进行比较,也可以使用ANY ,IN和SOME进行集合的匹配。
系统分类:&>>&
交友类型:科研类&
昵称:&28岁&女&计算机类&本科&上海/上海市&职业:文字/艺术/设计
交友要求:性别:不限&年龄:20至40岁&学历:大专&婚姻:不限&
交友类型:学习类&
昵称:&20岁&女&计算机类&本科&北京/北京市&职业:在校学生
交友要求:性别:不限&年龄:18至24岁&学历:本科&婚姻:未婚&
交友类型:休闲类&
昵称:&34岁&女&公关文秘类&大专&天津/天津市&职业:服务
交友要求:性别:不限&年龄:25至45岁&学历:大专&婚姻:不限&
交友类型:不限&
昵称:&19岁&女&公关文秘类&大专&北京/北京市&职业:行政/人事/后勤
交友要求:性别:不限&年龄:18至30岁&学历:大专&婚姻:未婚&怎么查看oracle数据库的全局临时表是否正确的插入了数据
今天遇到一个这样的问题,程序中有一个用来存储程序报错信息的临时表,就是每次当程序运行出错的时候,就会将相应的报错信息插入到临时表中,然后调用临时表中的数据在界面上显示给用户,然后今天出现的问题是,报错的界面出现了,但是没有正确的显示出报错信息,而是一片空白。在这个问题情景下,我就有了一个想知道数据是否正确插入到了临时表,但是我们都知道临时表是session级的,一个session是无法查看到另一个session临时表的数据的,所以,问题也就来了。本文就这个问题,提供下面的这种处理思路,如果你对oracle中的临时表还不是特别了解,可以先参考下博客中《》这篇文章。1、创建临时表为了方便后面写代码,先把临时表的结构表示出来,可以看下面的这段创建临时表的代码。--&创建临时表
CREATE&GLOBAL&TEMPORARY&TABLE&CMX_ERRORS_TMP
&&SEQ_NUM&&&&&&&&&&NUMBER,
&&ERROR_SOURCE&&&&&VARCHAR2(100),
&&ERROR_MESSAGE&&&&VARCHAR2(4000),
&&CREATION_DATE&&&&DATE&DEFAULT&SYSDATE&NOT&NULL,
&&CREATED_BY&&&&&&&NUMBER&DEFAULT&-1&NOT&NULL,
&&DESCRIPTION&&&&&&VARCHAR2(100)
ON&COMMIT&PRESERVE&ROWS;2、创建一个和临时表结构一样的普通表创建一个普通表,用来存储临时表中的记录。--&创建一个普通表
CREATE&TABLE&cmx_tmp_bak&AS&SELECT&*&FROM&cmx_errors_tmp&WHERE&1&=&0;3、在临时表上创建一个触发器在临时表上面创建一个触发器,以实现每当往临时表中插入一条记录的时候,同时也将这条记录插入到前面建的那个普通表中。--&创建before&insert触发器
CREATE&OR&REPLACE&TRIGGER&cmx_errors_bak_trigger
&&BEFORE&INSERT&ON&cmx_errors_tmp
&&FOR&EACH&ROW
&&INSERT&INTO&cmx_tmp_bak
&&&&(seq_num,&error_source,&error_message,&creation_date,&created_by,&description)
&&&&(:new.seq_num,&:new.error_source,&:new.error_message,&:new.creation_date,&:new.created_by,&:new.description,);
END;这里有个地方需要注意的是,oracle不允许在触发器中加commit和rollback。4、测试insert几条记录到cmx_errors_tmp表,先不写commit,查询cmx_tmp_bak,会发现没有插入数据进来。现在加上commit,再查询cmx_tmp_bak表,发现数据插入进来了。想想为什么?原理上来说,根据上面的做法就已经将记录插入到了备份表中,但是你会发现你打开一个会话,然后select查询这个备份表,却依然可能没有看到有数据插入进来,我也遇到了这个问题,后来发现我在插入数据到临时表的时候,并没有加commit操作,而且在触发器中也是不能加commit提交的,那么在没有commit的情况,我新建一个session来查询,这个时候数据并没有被写入数据库,所以是查不到的。后来,我在插入错误数据到临时表的代码中加了commit操作,然后再次查询备份表,发现数据正确的插入进来了。上面只是实现了insert的备份,如果你要实现更多的操作,比如delete、update,也可以相应的做一些修改,可以同时参考《》这篇文章。数据库临时表问题_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
数据库临时表问题
上传于||暂无简介
阅读已结束,如果下载本文需要使用
想免费下载本文?
你可能喜欢

我要回帖

更多关于 mysql查询创建临时表 的文章

 

随机推荐