- 浏览: 414380 次
- 性别:
- 来自: 厦门
文章分类
- 全部博客 (202)
- Oracle (35)
- MsSQL (10)
- MySQL (8)
- Jsp (7)
- Java 基础 (21)
- 零星点缀 (20)
- PowerDesigner (3)
- dotNet (5)
- Hibernate (8)
- 搜索技术 (3)
- Linux (18)
- jQuery (4)
- POI/excel/word (2)
- javascript (6)
- PHP (4)
- JSTL (3)
- winows 操作系统 (6)
- HTML基础 (2)
- 网络兼职 (3)
- spring (7)
- 人生 (2)
- 网络协议之Http (3)
- JDBC (1)
- FSO(FileSystemObject)技术 (3)
- css样式 (1)
- EnterpriseDb (2)
- VMware (1)
- Android (1)
- 数据转换工具=》 (1)
- Oracle-->statspack (2)
- Oracle==>性能 (1)
- Greenplum (1)
- 库的转换 (1)
- DOS (1)
最新评论
-
青春的、脚步:
xingmei_ok 写道解密失败。。。。原始:aMD5后:0 ...
java的MD5加密、解密 -
xingmei_ok:
New_Mao_Er 写道看着标题我就蛋疼了,md5 是一个摘 ...
java的MD5加密、解密 -
New_Mao_Er:
看着标题我就蛋疼了,md5 是一个摘要算法,是无法解密的,如果 ...
java的MD5加密、解密 -
xingmei_ok:
解密失败。。。。
原始:a
MD5后:0cc175b9c0f ...
java的MD5加密、解密 -
yinxueyuan122:
[b][/b][size=xx-small][/siz ...
java的MD5加密、解密
在数据库日常维护工作中,我们可能经常需要把某个查询结果插入到现有的表中。如需要把两张表进行合并、需要把另外一张报纸能够符合条件的的记录插入到现有的表中、需要把另外一张表中的某些字段重新整理后插入到现有的表中等等。但是,我们都知道在数据库中对此进行操作,不想Excel表格那么方便,通过选择、复制、粘贴即可以完成工作表之间的合并。在数据库中,不能够对列直接进行复制与粘贴的操作。那么在数据库中能否有简单而有效的解决措施呢?其实在SQLServer数据库中,灵活使用insert into Select(插入结果查询)语句就可以实现这个需求。
如现在由于公司人事部门合并后需要把数据库中的USER_A中的数据复制到表USE_B中。那么就可以利用如下的语句来实现:
Insert into USER_B (ad_user_id,Value,name,manager_id)
Select ad_user_id,Value,name,manager_id from USER_A Where( manager_id =100001)
通过如上这条简单的insert into select语句就可以把某一张表中符合条件的记录插入到目标表中。不过这条语句虽然比较简单,但是其中的条条框框仍然有很多。具体的来说,在使用这条语句的时候,需要遵守如下的这些条条框框。
一、需要指定源表中需要复制的列。
有时候可能复制与被复制的表表结构不同。如需要把表A中的name(英文名字)字段复制到表B中的name2(中文名字)中。此时原有复制表与被复制表中字段的名称不同,为此需要在上面的语句中,把所需要复制列名称一一列举出来。另外可能只需要把被复制表中的部分列复制到目的表总,此时也有显示的指名所需要复制的列。注意复制对象与目标对象都需要列出,以免发生张冠李戴的现象。笔者在使用这条语句的时候,不管任何情况,及时两者表格中的内容完全一致,笔者也习惯在语句中把字段的名称一一的列出。虽然这会增加一定的工作量,但是却可以提高这条语句执行的准确性。简而言之,就是需要在语句中指定源表zhon纲要复制其内容的列;指定目标表总要向其中复制数据的目标列。即使两这个表中的这些列名称相同,也最好能够显示的指定。此时数据库管理员不能够偷懒,否则的话很容易导致数据插入错误,而一切要重头再来。
二、存储数据时的顺序。
如果现在在源表中有一万条符合条件的记录要保存到目的表中,那么这些记录在数据库中存储的顺序应该是什么呢?默认情况下,其存储的数据顺序就是查询结果所得到的顺序。在没有采用排序语句的情况下,其实就是源表中实际存储的顺序(一般按记录创建的先后顺序来保存)。不过有时候可能这个排序顺序不怎么合理。笔者在认为,最好对需要插入的结果进行恰当的排序,这有利于提高插入记录的查询效率。如在牧地中,可能对员工编号设置了索引;或者在目的表中查询员工的信息是按员工编号来排序的。那么在目的表中插入数据的时候,最好能够按员工的编号来进行排列。是顺序还是逆序排列要跟目的表中保持一致。如此的话,插入数据后进行查询的话,如需要查询所有后来插入的结果,那么就不需要对其进行重新排序。因为存储的时候就是按照员工编号来插入,那么查询出来的数据也是按照员工编号来的。可见,为需要插入的数据设置合理的排序顺序,这有利于提高以后查询的性能。故笔者建议,为了提高数据库的性能,最好在插入数据的时候利用Order BY语句指定插入数据时的顺序。虽然这不是强制性的,但是笔者建议各位数据库管理员还是要这么做。
三、指定复制行的条件。
需要把某张表中的记录复制到另外一张表中,往往需要指定复制行的条件。也就是说,往往不会把源表中所有的记录都复制到目的表中。如现在需要把员工信息A表中的数据复制到员工信息B表中。可是由于员工离职或者其他的原因,员工信息A表中的记录可能有些已经作废掉了。如果把A表中的数据不加过滤就直接把全部记录都一成不变的复制到B表中,那显然会给B表增加不少的垃圾数据。为此在复制数据到目的表的表的时候,企业用户可能只需要把现在还在职的员工信息复制到B表中。此似,在使用上面的语句时,就需要利用Where条件来限制需要复制的行。如一般在数据库系统设计的时候,都会在表中加入一个isactive类似的控制字段,表示当前记录是否有效。当员工离职时,不会删除这个员工的信息,而是会把其设置为不活跃。在数据库表中反应出来的就是这个字段为N。为此,在上面的语句中,要把isactive列对应的值为N的记录去掉。所以如果在表与表合并的时候,需要根据一定的规则来过滤数据的话,则可以在语句中加入Where语句来进行限制。这个限制虽然不是必须的,但是却可以避免把一些垃圾数据也导入到新表中。
虽然数据库管理员可以先把所有的记录先都复制到目的表中,然后再利用delete语句进行删除。但是笔者并不赞成这么做。一方面这么做会额外的增加工作量;其次也会对目标表中的数据产生破坏。因为在目标表中执行delete语句中,如果条件设置不当,那么很有可能把目标表中的数据也删除了。所以说,复制记录后再进行删除,这个操作会带来一定的风险。一不小心,就会破坏源表中的数据。其实,在复制的时候,在语句中加入Where限制语句就可以轻而易举的避免这种风险。既然如此,数据库管理员还有什么理由还需要在事后再冒这个风险呢?
四、插入结果时要注意数据的兼容性。
当把记录插入到目的表中,需要注意源表中的内容必须与目标中的列兼容。这主要包含两个方面的含义。一是数据类型要兼容,二是其字段的大小需要兼容。如源表中的name字段的长度为22;而目的表中这个字段的长度只有20。则在执行以上的语句时,就很可能因为数据长度过长而导致复制失败。除了要注意这个字段长度的兼容之外,还需要注意的是数据库在复制的过程中会对某些数据类型进行自动的转换。如源表中员工编号这个字段可能是采取流水号编号,为此数据库中的字段类型可能就是整数型。而在目的表中,对于员工编号采用部门号(字符)+流水号的形式,那么在数据库表中其采用的就是字符类型格式。现在需要把源表中的员工编号的字段内容复制到目的表中,是可以的。虽然两者的数据类型不同,但是把整数型的数据复制到字符型的字段中,这是允许的。也就是说,他们是兼容的。但是需要注意的是,复制过去后,原先的整数型数据在目的表中会以字符型数据来存储,而不是整数型数据。为此如果后来因为其他原因,需要把目的表中的数据再复制到源表中时,就会发生错误。因为字符型数据是无法在整数型数据类型中进行存储。所以说,在数据库中所谓的兼容往往是单向的。这一点在进行记录复制的时候,需要特别的当心。
另外有些数据类型可能是不兼容的,那么在复制数据的时候,数据库管理员需要采用数据类型转换函数对其进行强制转换。如某个字段虽然存储的都是数字,但是其数据库中的数据类型是字符型的。此时需要把字符型的数据(全部都是数字)复制到整数型的字段中,则需要利用强制转换函数先对数据类型进行转换,然后再进行复制。这也是解决数据类型不一致的一个有效措施。
五、执行复制时的注意事项。
在使用这条语句的时候,需要注意其跟普通的insert语句不同。通常情况下,如果利用Insert语句插入记录的时候,如果发现插入的记录有问题,则可以通过撤销执行插入操作(在没有递交事务之前)来撤销插入的操作。但是使用insert into 语句进行表与表之间合并记录的时候,则是不能够执行撤销操作的。为此为了数据的安全,最好在执行insert into语句之前,对数据库来一个手工的完全备份。如此当这个操作有问题的时候,则可以通过恢复数据库来解决由此带来的问题。
另外,在执行这个语句的时候,最好先执行一下其SELECT子句,看看其查询出来的结果是否符合用户的需要。当这个查询语句设计准确后,再把其跟Insert into 语句结合起来使用,这个方法可以提高表记录合并的准确率。虽然中间多了一个查询的步骤,但是对于数据的准确性来说,这一个步骤还是值得的。
转http://database.ctocio.com.cn/488/8861488_1.shtml
如现在由于公司人事部门合并后需要把数据库中的USER_A中的数据复制到表USE_B中。那么就可以利用如下的语句来实现:
Insert into USER_B (ad_user_id,Value,name,manager_id)
Select ad_user_id,Value,name,manager_id from USER_A Where( manager_id =100001)
通过如上这条简单的insert into select语句就可以把某一张表中符合条件的记录插入到目标表中。不过这条语句虽然比较简单,但是其中的条条框框仍然有很多。具体的来说,在使用这条语句的时候,需要遵守如下的这些条条框框。
一、需要指定源表中需要复制的列。
有时候可能复制与被复制的表表结构不同。如需要把表A中的name(英文名字)字段复制到表B中的name2(中文名字)中。此时原有复制表与被复制表中字段的名称不同,为此需要在上面的语句中,把所需要复制列名称一一列举出来。另外可能只需要把被复制表中的部分列复制到目的表总,此时也有显示的指名所需要复制的列。注意复制对象与目标对象都需要列出,以免发生张冠李戴的现象。笔者在使用这条语句的时候,不管任何情况,及时两者表格中的内容完全一致,笔者也习惯在语句中把字段的名称一一的列出。虽然这会增加一定的工作量,但是却可以提高这条语句执行的准确性。简而言之,就是需要在语句中指定源表zhon纲要复制其内容的列;指定目标表总要向其中复制数据的目标列。即使两这个表中的这些列名称相同,也最好能够显示的指定。此时数据库管理员不能够偷懒,否则的话很容易导致数据插入错误,而一切要重头再来。
二、存储数据时的顺序。
如果现在在源表中有一万条符合条件的记录要保存到目的表中,那么这些记录在数据库中存储的顺序应该是什么呢?默认情况下,其存储的数据顺序就是查询结果所得到的顺序。在没有采用排序语句的情况下,其实就是源表中实际存储的顺序(一般按记录创建的先后顺序来保存)。不过有时候可能这个排序顺序不怎么合理。笔者在认为,最好对需要插入的结果进行恰当的排序,这有利于提高插入记录的查询效率。如在牧地中,可能对员工编号设置了索引;或者在目的表中查询员工的信息是按员工编号来排序的。那么在目的表中插入数据的时候,最好能够按员工的编号来进行排列。是顺序还是逆序排列要跟目的表中保持一致。如此的话,插入数据后进行查询的话,如需要查询所有后来插入的结果,那么就不需要对其进行重新排序。因为存储的时候就是按照员工编号来插入,那么查询出来的数据也是按照员工编号来的。可见,为需要插入的数据设置合理的排序顺序,这有利于提高以后查询的性能。故笔者建议,为了提高数据库的性能,最好在插入数据的时候利用Order BY语句指定插入数据时的顺序。虽然这不是强制性的,但是笔者建议各位数据库管理员还是要这么做。
三、指定复制行的条件。
需要把某张表中的记录复制到另外一张表中,往往需要指定复制行的条件。也就是说,往往不会把源表中所有的记录都复制到目的表中。如现在需要把员工信息A表中的数据复制到员工信息B表中。可是由于员工离职或者其他的原因,员工信息A表中的记录可能有些已经作废掉了。如果把A表中的数据不加过滤就直接把全部记录都一成不变的复制到B表中,那显然会给B表增加不少的垃圾数据。为此在复制数据到目的表的表的时候,企业用户可能只需要把现在还在职的员工信息复制到B表中。此似,在使用上面的语句时,就需要利用Where条件来限制需要复制的行。如一般在数据库系统设计的时候,都会在表中加入一个isactive类似的控制字段,表示当前记录是否有效。当员工离职时,不会删除这个员工的信息,而是会把其设置为不活跃。在数据库表中反应出来的就是这个字段为N。为此,在上面的语句中,要把isactive列对应的值为N的记录去掉。所以如果在表与表合并的时候,需要根据一定的规则来过滤数据的话,则可以在语句中加入Where语句来进行限制。这个限制虽然不是必须的,但是却可以避免把一些垃圾数据也导入到新表中。
虽然数据库管理员可以先把所有的记录先都复制到目的表中,然后再利用delete语句进行删除。但是笔者并不赞成这么做。一方面这么做会额外的增加工作量;其次也会对目标表中的数据产生破坏。因为在目标表中执行delete语句中,如果条件设置不当,那么很有可能把目标表中的数据也删除了。所以说,复制记录后再进行删除,这个操作会带来一定的风险。一不小心,就会破坏源表中的数据。其实,在复制的时候,在语句中加入Where限制语句就可以轻而易举的避免这种风险。既然如此,数据库管理员还有什么理由还需要在事后再冒这个风险呢?
四、插入结果时要注意数据的兼容性。
当把记录插入到目的表中,需要注意源表中的内容必须与目标中的列兼容。这主要包含两个方面的含义。一是数据类型要兼容,二是其字段的大小需要兼容。如源表中的name字段的长度为22;而目的表中这个字段的长度只有20。则在执行以上的语句时,就很可能因为数据长度过长而导致复制失败。除了要注意这个字段长度的兼容之外,还需要注意的是数据库在复制的过程中会对某些数据类型进行自动的转换。如源表中员工编号这个字段可能是采取流水号编号,为此数据库中的字段类型可能就是整数型。而在目的表中,对于员工编号采用部门号(字符)+流水号的形式,那么在数据库表中其采用的就是字符类型格式。现在需要把源表中的员工编号的字段内容复制到目的表中,是可以的。虽然两者的数据类型不同,但是把整数型的数据复制到字符型的字段中,这是允许的。也就是说,他们是兼容的。但是需要注意的是,复制过去后,原先的整数型数据在目的表中会以字符型数据来存储,而不是整数型数据。为此如果后来因为其他原因,需要把目的表中的数据再复制到源表中时,就会发生错误。因为字符型数据是无法在整数型数据类型中进行存储。所以说,在数据库中所谓的兼容往往是单向的。这一点在进行记录复制的时候,需要特别的当心。
另外有些数据类型可能是不兼容的,那么在复制数据的时候,数据库管理员需要采用数据类型转换函数对其进行强制转换。如某个字段虽然存储的都是数字,但是其数据库中的数据类型是字符型的。此时需要把字符型的数据(全部都是数字)复制到整数型的字段中,则需要利用强制转换函数先对数据类型进行转换,然后再进行复制。这也是解决数据类型不一致的一个有效措施。
五、执行复制时的注意事项。
在使用这条语句的时候,需要注意其跟普通的insert语句不同。通常情况下,如果利用Insert语句插入记录的时候,如果发现插入的记录有问题,则可以通过撤销执行插入操作(在没有递交事务之前)来撤销插入的操作。但是使用insert into 语句进行表与表之间合并记录的时候,则是不能够执行撤销操作的。为此为了数据的安全,最好在执行insert into语句之前,对数据库来一个手工的完全备份。如此当这个操作有问题的时候,则可以通过恢复数据库来解决由此带来的问题。
另外,在执行这个语句的时候,最好先执行一下其SELECT子句,看看其查询出来的结果是否符合用户的需要。当这个查询语句设计准确后,再把其跟Insert into 语句结合起来使用,这个方法可以提高表记录合并的准确率。虽然中间多了一个查询的步骤,但是对于数据的准确性来说,这一个步骤还是值得的。
转http://database.ctocio.com.cn/488/8861488_1.shtml
发表评论
-
闪回数据库
2010-07-16 15:31 1261如何启用Oracle10g闪回数据库特性 1.确认当前模式 ... -
http://itlife365.com/?post=212
2010-07-16 15:07 1020处理ORACLE单个sql执行出现多个session的心得: ... -
从public回收SELECT ANY TABLE权限(或其他类似权限)将导致数据库中所有的procedure、function和package失效。
2010-07-16 14:50 2028从public回收SELECT ANY TABLE权限(或其他 ... -
Oracle数据库定期自动备份
2010-06-01 17:13 1571近期经常遇到Oracle备份与还原的问题,总是做些重复的工 ... -
利用Oracle CRS搭建应用的高可用集群(部份)
2010-06-01 10:38 1315前言:CRS的简介和由来 从Oracle 10gR1 RAC ... -
ORACLE RAC原理
2010-05-31 23:54 1428RAC体系结构 在一个应 ... -
批量更新
2010-05-28 10:41 871有如下两个表: table1: f ... -
如何找出Oracle中需要或值得重建的索引
2010-05-26 14:22 1174This script determines whether ... -
oracle10g for linux 4 自动启动及脚本
2010-05-25 12:49 1029关于oracle在linux系统下安装后,如何在系统重启的情况 ... -
order by 使用索引的情况
2010-05-25 11:14 3225order by 使用索引的情况 參考http://pub. ... -
SQL中随机选取行
2010-05-11 17:40 1984Mssql : SELECT TOP 10 OrderID, ... -
ORACLE sql 使用列别名
2010-04-21 16:22 3012如果希望在别名中使用空格,并要保留空格,就必须使用双引号将别名 ... -
Oracle行列转换总结
2010-04-19 21:08 718oracle行列转换总结 最近论坛很多人提的问题都与行列转 ... -
Oracle ==>SQL 查询根据字符串的长度排序
2010-04-13 17:06 2983select * from student s wh ... -
sql中使用: case
2010-04-02 17:23 1052sql中使用: case Store_Information ... -
关于数据库中使用 left join on ...and ...和 left join on ....where ...区别,和使用group by 要注意的情
2010-04-02 17:21 1382关于数据库中使用 left join on ...and .. ... -
sql多表连接查询inner join, left join , right join ,full join ,cross join 学习
2010-04-02 17:18 1990浅显易懂: inner join,ful ... -
Oracle - 一个sequence重置的方法
2010-04-01 14:20 1102Oracle - 一个sequence重置的方法 收藏 ... -
oracle主键自动增长的设置
2010-04-01 13:25 12181建立数据表 create table Test_Incr ... -
PL/SQL DEVELOPER 基本用法详解
2010-03-25 11:33 1695PL/SQL DEVELOPER 基本用法详解(建议写过第一个 ...
相关推荐
SQL 将查询结果插入表中宣贯 在数据库日常维护工作中,我们可能经常需要把某个查询结果插入到现有的表中。如需要把两张表进行合并、需要把另外一张表能够符合条件的记录插入到现有的表中、需要把另外一张表中的某些...
SQL 将查询结果插入表中总结 在数据库日常维护工作中,我们经常需要把某个查询结果插入到现有的表中。例如需要把两张表进行合并、需要把另外一张表能够符合条件的记录插入到现有的表中、需要把另外一张表中的某些...
SQL 将查询结果插入表中 在数据库日常维护工作中,我们可能经常需要把某个查询结果插入到现有的表中。例如,需要把两张表进行合并、需要把另外一张表能够符合条件的记录插入到现有的表中、需要把另外一张表中的某些...
INTO` 语句,但MySQL不支持直接将查询结果存入临时表,所以通常采用 `CREATE TABLE AS SELECT` 或 `INSERT INTO ... SELECT` 的方式: ```sql -- 创建临时表并填充数据 CREATE TABLE tmp_table_name AS SELECT ...
### 将SQL查询结果保存到数据表的知识点 ...通过以上内容,我们可以了解到如何有效地将SQL查询结果保存到数据表中,以及在实际操作中需要注意的一些细节问题。这对于数据库管理和开发工作都是非常重要的。
例如,使用 INSERT INTO...SELECT 语句从临时表或查询结果集中一次性插入大量数据。 2. **事务处理**:将多行插入操作包裹在同一个事务中,虽然仍然需要逐行插入,但可以通过减少事务边界来提高效率。 3. **预处理...
这个例子中,子查询首先从 `Student` 表中按系分组计算平均年龄,然后 `INSERT` 语句将这些结果插入到 `Deptage` 表的相应列中。 总之,SQL 的数据插入功能提供了灵活的方式向数据库表中添加数据,无论是单个记录...
页分裂通常发生在向表中插入数据时,尤其是当数据量增长到需要在现有的数据页之外分配新的数据页时。如果表的主键是自增的,那么每次插入新数据时,自增值都会保证新数据存储在新的数据页中,并且确保每个数据页的...
这种操作称为“追加查询”,它将查询结果插入到已存在的表中,或者创建一个新的表来存储结果。这使得用户能够基于现有数据的特定条件或计算生成新的数据集合。 2. **基于查询的报表和窗体**:报表和窗体是Access中...
使用`INSERT INTO`语句将查询结果插入到`mid`表中: ```sql INSERT INTO mid (travelway_id, destination) SELECT travel_way.id, GROUP_CONCAT(traveltag.content) FROM travel_way LEFT JOIN tagrelation ...
我们可以使用 openrowset 函数来导入数据,并使用 INSERT 语句来将数据插入到表中。 知识点9: 查询和更新操作 在实验中,我们使用了多种查询和更新操作来查询和更新表中的数据。例如,我们可以使用 SELECT 语句来...
它提供了强大的功能来查询、插入、更新和删除数据库中的数据。 #### 二、SQL数据类型 在SQL中,每个数据库表的列都必须指定一种数据类型。以下是一些常见的数据类型: - **INT**(整数):用于存储整数值。 - **...
本文将深入探讨如何在C#中实现多表查询,并通过一个示例程序来具体说明其应用方式。 ### C#中的多表查询 多表查询允许你在单个查询中访问和操作多个表的数据,这对于数据分析、报告生成以及各种数据密集型应用来说...
以下是一些关于如何处理数据库表中插入重复数据的策略和方法。 首先,可以通过在创建表的时候设定某些字段为唯一(UNIQUE)约束来防止重复数据。例如,如果在`user_info`表中,`uid`、`last_name`和`first_name`的...
`SELECT INTO`语句可以创建一个新的表,并将查询结果插入其中。这在创建基于现有数据的汇总表或临时表时非常有用。在例子中,新表`pricetable`包含了`products`表的`productname`、`unitprice`及其10%的税。 `...
本文将深入探讨如何使用Visual C++(简称VC)来操作SQL Server数据库中的主从表。主从表是一种常见的数据库设计模式,其中主表存储关键数据,而从表则包含与主表相关联的详细信息。这种方式可以有效地组织大量数据并...
Hive 支持从现有的表中查询数据,并将结果导入到新的表中。这种方式特别适用于数据转换场景。 **示例**: 假设存在一个名为 `source_table` 的表,其中包含了一些原始数据,现在需要将这些数据经过某些筛选条件后...
此命令将返回`student`表中的所有列的所有数据。 - **查询特定字段**: ```sql SELECT name, grade, gender FROM student; ``` 如果只关心特定的几个字段,可以通过指定这些字段来简化查询结果。 #### 三、...
- **SELECT…INTO语句**:此语句创建一个新的表,并将查询结果中的字段值复制到新表中,适用于数据迁移或整理。 3. **SQL特定查询**: - 有些SQL查询,如联合查询、传递查询和数据定义查询,不能直接在查询设计...
例如,`SELECT`语句用于查询数据,`INSERT INTO`用于插入新记录,`UPDATE`用于修改现有记录,而`DELETE FROM`则用于删除记录。 3. **处理结果集**:对于查询操作,结果会被返回为`ResultSet`对象,可以通过遍历这个...