有关子查询的多行插入的问题

时间:2010-08-25 05:37:55

标签: mysql subquery

说我有以下2个表,

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 个答案:

答案 0 :(得分:2)

看起来您可以使用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)

答案 1 :(得分:0)

有mysql insert ... select

INSERT INTO table ( fields )
SELECT fields FROM table;