准备好的声明 - 交叉表更新

时间:2015-05-29 16:46:01

标签: php mysql database sql-update

我正在尝试将预准备语句与交叉表更新结合使用。我准备了一个代表我们大型数据库的示例脚本。第一部分在没有准备好的声明的情况下完成了我想要的,但我希望避免为我的每一列数据复制/粘贴它。

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;

1 个答案:

答案 0 :(得分:0)

我从未见过" SELECT INTO"这样工作。根据我的经验,它是这样使用的:

SELECT [field_list] INTO [variable_list] 
FROM [some_table] 
[etc...]

我认为它不能用于存储您正在尝试的结果集。

通过一些调整并在存储过程中执行此操作,您可以使用游标迭代结果以单独准备和执行每个生成的语句。