说我有以下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个查询中完成所有操作。有任何想法吗?在此先感谢:)
答案 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;