问:今天遇到一个select into 的问题; 
 我想让INSERT INTO  table (f1,f2) SELECT (V1,V2(这里值=值 +上一条插入记录的v2值))
 
例如 我有一个表 t1 (v_id,v_value) v_id自增 现在有两条记录  
1、30,
2、35
t2表 (v_id,v_va) v_id 自增 t2表 有4条记录
1、5
2、5
3、5
4、5
要求是 把t2 表数据 插入到 t1 中 并累加 t1表 v_value 值
下边是我想一种方式 插入每次获取一下t1的最后一条记录值
eg:INSERT INTO t1 (v_id,v_value) SELECT v_id,v_va+(SELECT TOP 1 v_id FROM t1  ORDER BY v_id ) FROM t2  不知道有没有大神 有没有更好的方式; 游标是可以实现但是 效率上 我也就没有用

解决方案 »

  1.   

    是05  我知道 INSERT INTO 可以用  OUTPUT 但是 INSERT INTO  SELECT  这样怎么使用output 呢?
      

  2.   

    不是 t2 表 里是有数据的 只 是把t2 表里的数据 全部 插入到t1 中 实现一个累加的过程 ! 对我忘记 写最t1 的结果了 t1 的结果 
    eg: SELECT  * FROM t1 
    /*结果*/
    1|30
    2|35
    3|40
    4|45
    5|50
    6|55
    看到这个结果你可能就明白了
      

  3.   

    除了SELECT TOP 1 v_id FROM t1 ORDER BY v_id desc 
    想不到什么别的方法
      

  4.   

    不用top和order by,直接用max呢?
    INSERT INTO t1 (v_id,v_value) SELECT v_id,v_va+(SELECT max(v_value) FROM t1) FROM t2 
      

  5.   

    这个我想了 不能 因为  t2表中 可能 有负数 所以 这个 max(value) 不准
      

  6.   

    嗯 谢谢了 本来我想的 是 insert into select 也能出现 output 类似这样的用法  嘎嘎。。  谢谢了 !
      

  7.   

    下面代码是sql2008的,没2005,你试试:
    ;with t as 
    (
    select top 1 0 as id,v_value as v_va,0 as RN from t1 order by v_id desc
    union all
    select v_id,v_va,ROW_NUMBER() over(order by v_id) as RN from t2 
    )
    insert into t1(v_value)
    select  SUM(b.v_va) as sumValue From t a join t b 
    on a.RN>=b.RN and a.id>0
    group by a.id
      

  8.   


    IF EXISTS (SELECT 1 FROM SYSOBJECTS WHERE name = 't2' )
    BEGIN
    DROP TABLE t2
    END
    GO
    CREATE TABLE t2
     (
    v_id INT IDENTITY(1,1),
    v_va INT
    )
    GO
    IF EXISTS (SELECT 1 FROM SYSOBJECTS WHERE name = 't1' )
    BEGIN
    DROP TABLE t1
    END
    GO
    CREATE TABLE t1
     (
    v_id INT IDENTITY(1,1),
    v_value INT
    )
    GOINSERT INTO t1 
    SELECT 30 UNION
    SELECT 35INSERT INTO t2
    SELECT 5 UNION ALL
    SELECT 5 UNION ALL
    SELECT 5 UNION ALL
    SELECT 5 GOWITH t3 AS
    (
    SELECT (SELECT SUM(v_va) FROM t2 As A WHERE A.v_id <= B.v_id) + (SELECT TOP 1 v_value FROM t1 ORDER BY v_id DESC) AS v_va
    FROM t2 AS B
    )INSERT INTO t1 (v_value) SELECT v_va FROM t3 SELECT * FROM t1v_id v_value
    1 30
    2 35
    3 40
    4 45
    5 50
    6 55
      

  9.   


    请教一下,14楼的代码在我这里报错,
    原因是:union all中的第一个select 使用了 order by ,在你那里没报错吗?
      

  10.   


    模仿#14写了一个。insert into t1
    SELECT (
    SELECT SUM(v_va) 
    FROM t2 As A 
    WHERE A.v_id <= B.v_id) 
    + (SELECT TOP 1 v_va
    FROM t1 
    ORDER BY v_id DESC) AS v_va
    FROM t2 AS B