哇,看到论坛还可以请教数据库问题,正好手里有个问题一直没有解决,就是像下面有两个表,test1是我要操作的表,有学员的成绩,但你猜怎么的,正好就没有班级,姓名,只有个学号,test2相当于是基础信息表,有学号,有姓名有班级,现在就是需要根据学号这个唯一的字段,在test2中去搜索,把匹配到的班级,姓名,给插入到test1中,就相当于excel的vlookup函数,我也通过百度,写出了一个下面样子的函数,但是效率太慢了,也就3000多条数据,就要执行半分钟。求大佬赐教。
[Shell] 纯文本查看 复制代码 mariadb> select * from test1;+------+------+------+------+------+
| 学号 | 语文 | 数学 | 班级 | 姓名 |
+------+------+------+------+------+
| 11 | 80 | 90 | | |
| 21 | 60 | 70 | | |
| 68 | 99 | 88 | | |
+------+------+------+------+------+
3 rows in set (0.09 sec)
mariadb> select * from test2;
+------+--------+------+
| 学号 | 班级 | 姓名 |
+------+--------+------+
| 11 | 一年级 | 老李 |
| 21 | 三年级 | 小王 |
| 68 | 二年级 | 阿珍 |
+------+--------+------+
3 rows in set (0.29 sec)
mariadb> call test_fx();
Query OK, 3 rows affected (0.10 sec)
mariadb> select * from test1;
+------+------+------+--------+------+
| 学号 | 语文 | 数学 | 班级 | 姓名 |
+------+------+------+--------+------+
| 11 | 80 | 90 | 一年级 | 老李 |
| 21 | 60 | 70 | 三年级 | 小王 |
| 68 | 99 | 88 | 二年级 | 阿珍 |
+------+------+------+--------+------+
3 rows in set (0.09 sec)
[SQL] 纯文本查看 复制代码 CREATE DEFINER=`root`@`%` PROCEDURE `test_fx`()
BEGIN
DECLARE isdone INT DEFAULT 1;
DECLARE sn int;
DECLARE search CURSOR FOR SELECT DISTINCT
my_db.test1.`学号`
FROM
my_db.test1
WHERE
my_db.test1.`姓名`='';
DECLARE CONTINUE HANDLER FOR NOT FOUND SET isdone = 0;
OPEN search;
FETCH search INTO sn;
WHILE isdone DO
UPDATE my_db.test1,my_db.test2
SET
my_db.test1.`姓名` = my_db.test2.`姓名`,my_db.test1.`班级` = my_db.test2.`班级`
WHERE
my_db.test1.`学号` = my_db.test2.`学号` AND my_db.test1.`学号` = sn AND my_db.test1.`姓名` = '';
FETCH search INTO sn;
END WHILE;
CLOSE search;
END |