2009-08-25 74 views
1

我卡在正在使用子查询和一直无法阅读手册,并尝试不同的想法后弄明白更新查询。以下是查询表&查询。表Temp_2,Temp_3 & Temp_4都有33行,没有空值。MySQL的更新子查询问题

有关如何解决此问题的任何想法?

CREATE TABLE temp_2 (
    date_value date default NULL, 
    close_adj_value_1 double default NULL); 

CREATE TABLE temp_3 (
    date_value date default NULL, 
    first_close_adj_value_1 double default NULL); 

CREATE TABLE temp_4 (
    date_value date default NULL, 
    pct_return_1 double default NULL); 

INSERT INTO temp_4 (date_value) SELECT date_value FROM temp_2; 

UPDATE temp_4 
SET  pct_return_1 = 
    (SELECT ((temp_2.close_adj_value_1/temp_3.first_close_adj_value_1) - 1) 
    FROM  temp_2,temp_3 
    WHERE temp_2.date_value = temp_3.date_value); 

感谢, 埃里克

+0

你的子查询似乎是专门从temp_2和temp_3中选择的,而不考虑它在temp_4中更新的内容。这本质上会使temp_4中的所有行都获得相同的值。你究竟想要做什么? – VoteyDisciple 2009-08-25 23:01:14

回答

0

既然你使用MySQL,你可以使用它的多表UPDATE语法:

UPDATE temp_4 
JOIN temp_2 USING (date_value) 
JOIN temp_3 USING (date_value) 
SET temp_4.pct_return_1 = (temp_2.close_adj_value_1/
          temp_3.first_close_adj_value_1) - 1; 

我假设你想使用date_value列关联temp_4中的行到其他表中的行。

你可以使用另一种解决方案是将所有的值插入到一个空temp_4表一气呵成:

INSERT INTO temp_4 (date_value, pct_return_1) 
    SELECT temp_2.date_value, 
    (temp_2.close_adj_value_1/temp_3.first_close_adj_value_1) - 1 
    FROM temp_2 JOIN temp_3 USING (date_value); 
+0

比尔 - 谢谢你,这解决了我的问题。我想我的监视器上需要一个注释,在早晨喝咖啡之前不要对SQL执行任何操作。 问候, 埃里克 – user163129 2009-08-25 23:58:16

0

比尔如下所示的答案解决我的问题:

INSERT INTO temp_4 (date_value, pct_return_1) 
    SELECT temp_2.date_value, 
    (temp_2.close_adj_value_1/temp_3.first_close_adj_value_1) - 1 
    FROM temp_2 JOIN temp_3 USING (date_value); 
+0

太好了,我很高兴通过的方式来帮助......,这是习惯在这里StackOverflow上标注获奖回答“接受”。 – 2009-08-26 00:15:42

+0

比尔 - 我更新你的答案被接受。这是我第一次提交到网站,我对回复的质量和速度感到惊喜。 谢谢! – user163129 2009-08-26 00:31:24

+0

谢谢!干杯! – 2009-08-26 00:43:45