我正在尝试将预准备语句与交叉表更新结合使用。我准备了一个代表我们大型数据库的示例脚本。第一部分在没有准备好的声明的情况下完成了我想要的,但我希望避免为我的每一列数据复制/粘贴它。
SET SESSION group_concat_max_len = 1000000000;
drop table if exists update_test;
create table update_test(
time_index decimal(12,4),
a varchar(20),
b varchar(20),
c varchar(20));
insert into update_test(time_index) values(20150101.0000),(20150101.0015),(20150101.0030);
drop table if exists energy_values;
create table energy_values(
time_stamp decimal(12,4),
site_id varchar(5),
energy int);
insert into energy_values
values(20150101.0000,'a',100),(20150101.0000,'b',200),(20150101.0000,'c',300),
(20150101.0015,'a',400),(20150101.0015,'b',500),(20150101.0015,'c',600),
(20150101.0030,'a',700),(20150101.0030,'b',800),(20150101.0030,'c',900);
drop table if exists update_test_sites;
create table update_Test_sites(
sites varchar(5));
insert into update_test_sites values
('a'),('b'),('c');
update update_test, energy_values, update_test_sites
set update_test.a=energy_values.energy
where update_test.time_index = energy_values.time_stamp
and energy_values.site_id ='a';
update update_test, energy_values, update_test_sites
set update_test.b=energy_values.energy
where update_test.time_index = energy_values.time_stamp
and energy_values.site_id ='b';
update update_test, energy_values, update_test_sites
set update_test.c=energy_values.energy
where update_test.time_index = energy_values.time_stamp
and energy_values.site_id ='c';
select * from update_test;
这就是为什么我尝试过这样的东西来代替更新功能。但是,我经常会收到语法错误报告。任何人都可以确定我哪里错了吗?非常感谢!
SELECT
concat(
'update update_test, energy_values, update_test_sites
set update_test.',sites,'=energy_values.energy
where update_test.time_index = energy_values.time_stamp
and energy_values.site_id = ',sites,';
select * from update_test;')
from update_test_sites
where sites = 'a'
INTO @sql;
PREPARE stmt FROM @sql;
EXECUTE stmt;
答案 0 :(得分:0)
我从未见过" SELECT INTO"这样工作。根据我的经验,它是这样使用的:
SELECT [field_list] INTO [variable_list]
FROM [some_table]
[etc...]
我认为它不能用于存储您正在尝试的结果集。
通过一些调整并在存储过程中执行此操作,您可以使用游标迭代结果以单独准备和执行每个生成的语句。