代码之家  ›  专栏  ›  技术社区  ›  Jackson Davis

带子查询的多行插入问题

  •  2
  • Jackson Davis  · 技术社区  · 15 年前

    假设我有下面两张桌子,

    CREATE TABLE t1(
      name VARCHAR(25) NOT NULL,
      time INT,
      a INT
    );
    
    CREATE TABLE t2(
      name VARCHAR(25) NOT NULL,
      time INT,
      b INT
    );
    

    我想把所有的价值观( a )超出 t1 time-1 为方便起见),然后为每个名称从旧名称中减去新名称,并将这些值插入到 t2 time . 做这件事的慢方法包括

    SELECT name, a FROM t1 WHERE time = x;
    SELECT name, a FROM t1 WHERE time = x-1;
    (subtract the as for each name)
    INSERT INTO t2 VALUES ....;
    

    从我对子查询的(有限的)理解来看,应该有一种方法可以在1个查询中完成这一切。有什么想法吗?提前感谢:)

    2 回复  |  直到 15 年前
        1
  •  2
  •   Daniel Vassallo    15 年前

    看来你可以用 INSERT ... SELECT

    INSERT INTO t2 (name, time, b)
    SELECT  ta.name, ta.time time, (ta.a - tb.a) b
    FROM    t1 ta 
    JOIN    t1 tb ON (tb.time = ta.time - 1 AND tb.name = ta.name);
    

    INSERT INTO t1 VALUES ('t1', 1, 100);
    INSERT INTO t1 VALUES ('t1', 2, 200);
    INSERT INTO t1 VALUES ('t1', 3, 500);
    INSERT INTO t1 VALUES ('t1', 4, 600);
    INSERT INTO t1 VALUES ('t1', 5, 800);
    INSERT INTO t1 VALUES ('t1', 6, 900);
    

    结果:

    SELECT * FROM t2;
    +------+------+------+
    | name | time | b    |
    +------+------+------+
    | t1   |    2 |  100 |
    | t1   |    3 |  300 |
    | t1   |    4 |  100 |
    | t1   |    5 |  200 |
    | t1   |    6 |  100 |
    +------+------+------+
    5 rows in set (0.00 sec)
    
        2
  •  0
  •   Haim Evgi    15 年前

    我是mysql insert ... select

    INSERT INTO table ( fields )
    SELECT fields FROM table;