insert into select时自己加上编号

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了insert into select时自己加上编号相关的知识,希望对你有一定的参考价值。

问题:把一个表的几列按条件插入到一个临时表中,临时表中有序号一栏,现需确保每次用insert into select时都能自动从1开始给加上序号,问语句如何写?

insert into a(序号,产品规格,数量) select (???),产品规格,sum(数量) from b group by b.产品规格
另,我需要的是每次都从1开始,用自动增加的字段,每次都是累加上去的!
比如第一次插入了10条序号就是1-10
第2次又插入了5条,序号就是1-5而不是11-15是这个意思

还有个,是在ACCESS VBA里!

第一次查询:
create table #a( 序号 int identity not null, 产品规格 varchar(20), 数量 int)
insert into #a( 产品规格, 数量)
select 产品规格,sum(数量)
--where 你的条件
from b group by b.产品规格

--接下来处理数据,处理完了,再第二次查询

第二次查询:
drop table #a
create table #a( 序号 int identity not null, 产品规格 varchar(20), 数量 int)
insert into #a( 产品规格, 数量)
select 产品规格,sum(数量)
--where 你的条件
from b group by b.产品规格

--接下来处理数据,处理完了,再第三次查询

第三次查询:
drop table #a
create table #a( 序号 int identity not null, 产品规格 varchar(20), 数量 int)
insert into #a( 产品规格, 数量)
select 产品规格,sum(数量)
--where 你的条件
from b group by b.产品规格

--……
参考技术A 那就需要借助临时表,并使用identity函数
if exists(select * from tempdb.dbo.sysobjects where name='#')
drop table #
select identity(int,1,1) as 序号,产品规格,sum(数量) as 数量
into #
from b
group by b.产品规格

insert into a(序号,产品规格,数量)
select 序号,产品规格,数量
from #
参考技术B 触发器解决吧。。
b是你的数据来源表,临时表#A是一个中间层(嫁接) 前提是你a表的结构别违反了主键约束 也就是不要把a表的序号设置为单个主键处理
这个触发器的意思就是说每次有数据插入b表的时候,先把临时表删除(为了保证数据是每次插入的最新的,就不会检索出以前的数据了),然后把B表新增的数据经过处理导入临时表,就可以实现你每次插入的数据都是从1开始了。。
create trigger trig1 on b
for insert
as
begin
select identity(int,1,1) as 序号,产品规格,sum(数量) into #A from inserted group by inserted.产品规格
insert into a(序号,产品规格,数量) select 序号,产品规格,数量
from #A
end
参考技术C 可以用游标:

insert into a(序号,产品规格,数量) select RANK() OVER (ORDER BY 产品规格 DESC) as 序号,产品规格,sum(数量) from b group by b.产品规格
参考技术D insert into a(序号,产品规格,数量) select rownum,产品规格,sum(数量) from b group by b.产品规格

SELECT INTO 和 INSERT INTO SELECT比较

  Insert是T-sql中常用语句,但我们在开发中经常会遇到需要表复制的情况,如将一个table1的数据的部分字段复制到table2中,或者将整个table1复制到table2中,这时候我们就要使用SELECT INTO 和 INSERT INTO SELECT 表复制语句了。

  

  1.INSERT INTO SELECT语句

      语句形式为:Insert into Table2(field1,field2,...) select value1,value2,... from Table1

   (1) 要求目标表Table2必须存在,并且字段field,field2...也必须存在
      (2) 注意Table2的主键约束,如果Table2有主键而且不为空,则 field1, field2...中必须包括主键
   (3) 注意语法,不要加values,和插入一条数据的sql混了,不要写成:
      Insert into Table2(field1,field2,...) values (select value1,value2,... from Table1)
   (4) 由于目标表Table2已经存在,所以我们除了插入源表Table1的字段外,还可以插入常量。

  示例如下:

技术分享
--1.创建测试表
    create TABLE Table1
     (
         a varchar(10),
         b varchar(10),
         c varchar(10),
         CONSTRAINT [PK_Table1] PRIMARY KEY CLUSTERED
         (
             a ASC
         )
     ) ON [PRIMARY]

     create TABLE Table2
     (
         a varchar(10),
         c varchar(10),
         d int,
         CONSTRAINT [PK_Table2] 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
     select * from Table2

     --3.INSERT INTO SELECT语句复制表数据
    Insert into Table2(a, c, d) select a,c,5 from Table1
     GO

     --4.显示更新后的结果
    select * from Table2
     GO
     --5.删除测试表
    drop TABLE Table1
     drop TABLE Table2
INSERT INTO SELECT语句复制表数据

 

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 FROM创建表并复制表数据

 

以上是关于insert into select时自己加上编号的主要内容,如果未能解决你的问题,请参考以下文章

易语言 insert into

INSERT INTO SELECT 很慢,但是单独运行时 INSERT 或 SELECT 很快

调用 OPENROWSET 时 INSERT INTO 和 SELECT INTO 的区别

db2数据库,insert into a表 select * from b表 能不能设置每1000

insert into的用法

带有 SELECT 和 INNER JOIN 的 SQL INSERT INTO