Insert INTO table(field1,field2,...) values(value1,value2,...)这种形式的在应用程序开发中必不可少。但我们在开发、测试过程中,经常会遇到需要表复制的情况,如将一个table1的数据的部分字段复制到table2中,或者将整个table1复制到table2中,这时候我们就要使用SELECT INTO 和 INSERT INTO SELECT 表复制语句了。
1.INSERT INTO (SELECT FROM)语句(可连表、可加限制条件where子句)
语句形式为:INSERT INTO table2(a,b,d) (SELECT a,b,d FROM table1)
1.1SQL 将T_COMMISSION_TYPE 和T_PRODUCT_TYPE表的一些数据复制到T_COMMISSION中,部分字段复制!
一种策略对应1W多种产品,批量1W条。
INSERT INTO T_COMMISSION
(TYPE_NUM,PRODUCT_NUM,FAST_COMMISSION,CREATE_DATE,EMPLOYEE_ID
,OTHER_FAST_COMMISSION,MONEY,FAST_PRICE,ALL_FAST_COMMISSION
,OTHER_FAST_PRICE,ALL_FAST_PRICE)
(SELECT T1.TYPE_NUM,T2.PRODUCT_NUM,0,SYSDATE,'15145117218',0
,T2.MONEY,T2.MONEY,0,T2.MONEY,T2.MONEY
FROM T_COMMISSION_TYPE T1,T_PRODUCT_TYPE T2 WHERE T1.TYPE_NUM='default_type')
1.2 sqlMap文件TCommissionType.xml
<insert id="insertCommission" parameterClass="com.hanpeng.base.phone.model.TCommissionType"> INSERT INTO T_COMMISSION (TYPE_NUM,PRODUCT_NUM,FAST_COMMISSION,CREATE_DATE,EMPLOYEE_ID,OTHER_FAST_COMMISSION ,MONEY,FAST_PRICE,ALL_FAST_COMMISSION,OTHER_FAST_PRICE,ALL_FAST_PRICE) (SELECT T1.TYPE_NUM,T2.PRODUCT_NUM,0,SYSDATE,#employeeId#,0,T2.MONEY,T2.MONEY,0,T2.MONEY,T2.MONEY FROM T_COMMISSION_TYPE T1,T_PRODUCT_TYPE T2 WHERE T1.TYPE_NUM=#typeNum#) </insert>
1.3 CommissionTypeAction
/**
* 添加策略类型
* @throws IOException
*/
public String addCommType() throws IOException
{
if("true".equals(initLoadMethod)){
successPath = "/jsp/phone/priceStrategy/commissionType/addCommissionType.jsp";
return SUCCESS;
}
else{
boolean vali = validatePass2(password2);
if(vali){
try {
TCommissionType commType = new TCommissionType();
commType.setTypeNum( SysGuid.newDateGuid("", 30, 16) );//生成流水号
commType.setTypeName(typeName);
commType.setTypeInfo(typeInfo);
commType.setCreateDate(new Date());
commType.setEmployeeId(this.getUserId());
service.insertCommType(commType);//添加策略,同时批量1W条,为策略分配产品
setMsg("3002");
} catch (Exception e) {
log.error("CommissionTypeAction's addCommType():",e);
}
}
else{
setMsg("3001");
}
outPrint(msg);
return null;
}
}
1.4 CommissionTypeServiceImpl
@Service("CommissionTypeService")
public class CommissionTypeServiceImpl implements CommissionTypeService {
@Resource(name="CommissionTypeDAO")
private ICommissionTypeDAO commissionTypeDAO;
public void insertCommType(TCommissionType commissionType)throws SQLException {
commissionTypeDAO.insert(commissionType);
commissionTypeDAO.addCommission(commissionType);//批量1W条
}
}
1.5 CommissionTypeDAOImpl
@Repository("CommissionTypeDAO")
public class CommissionTypeDAOImpl extends BaseDAOImpl<TCommissionType>
implements ICommissionTypeDAO {
public CommissionTypeDAOImpl() {
super("TCommissionType");
}
/**批量1W条,为策略分配产品*/
public void addCommission(TCommissionType commissionType) throws SQLException{
getSqlMapClient().insert("TCommissionType.insertCommission", commissionType);
}
}
###SELECT查出需要插入的字段,还可以给固定的值,'15145117218'这样的直接插入的表中。
2.SELECT INTO FROM语句
语句形式为:SELECT vale1, value2 into Table2 from Table1
要求目标表Table2不存在,因为在插入时会自动创建表Table2,并将Table1中指定字段数据复制到Table2中 。示例如下:
--1.创建测试表
create TABLE Table1
(
a varchar(10),
b varchar(10),
c varchar(10),
CONSTRAINT [PK_Table1] PRIMARY KEY CLUSTERED
(
a ASC
)
) ON [PRIMARY]
GO
--2.创建测试数据
Insert into Table1 values('赵','asds','90')
Insert into Table1 values('钱','asds','100')
Insert into Table1 values('孙','asds','80')
Insert into Table1 values('李','asds',null)
GO
--3.SELECT INTO FROM语句创建表Table2并复制数据
select a,c INTO Table2 from Table1
GO
--4.显示更新后的结果
select * from Table2
GO
--5.删除测试表
drop TABLE Table1
drop TABLE Table2
####网上其他问题总结:
用select into来复制一些内容。发现在同一个数据库中是可以成功的。但现在我需要从旧的数据库中提取一些信息,新建另一个数据库,然后再放在里面。这个时候,我想用OPENDATASOURCE来代替table2,但是一直不成功,不知楼主有没有做过类似的功能?这个要怎么写?
答:这种事儿我干过,我的做法供你参考:
先建立新数据库查询旧数据库的DBLink;
执行语句:CREATE TABLE 新表名 AS SELECT * FROM 旧表名@旧数据库名。
===============
方法比较快捷,唯一的缺点是不能复制表结构