使用外部连接将mysql SELECT转换为更新
我正在尝试更新一个包含股票定价信息的表,以包括这些股票在不同时间段的收益。返回将在时间段的开始处插入。 下面的SELECT语句计算我要查找的3个月和6个月的保留期的值。该表为使用外部连接将mysql SELECT转换为更新,mysql,join,Mysql,Join,我正在尝试更新一个包含股票定价信息的表,以包括这些股票在不同时间段的收益。返回将在时间段的开始处插入。 下面的SELECT语句计算我要查找的3个月和6个月的保留期的值。该表为price\u returns SELECT curr.date, curr.company, curr.price, (mo3.price - curr.price)/curr.price AS 3MONTH_RETURN, (mo6.price - curr.price)/curr.
price\u returns
SELECT
curr.date, curr.company, curr.price,
(mo3.price - curr.price)/curr.price AS 3MONTH_RETURN,
(mo6.price - curr.price)/curr.price AS 6MONTH_RETURN
FROM
price_returns AS curr
LEFT OUTER JOIN
price_returns AS mo3
ON
((curr.date = LAST_DAY(mo3.date - INTERVAL 3 MONTH)) AND (curr.company = mo3.company))
LEFT OUTER JOIN
price_returns AS mo6
ON
((curr.date = LAST_DAY(mo6.date - INTERVAL 6 MONTH)) AND (curr.company = mo6.company))
Order by
curr.company, curr.date;
我想将此SELECT
转换为UPDATE
到表price\u returns
中,并将3MONTH\u RETURN
和6MONTH\u RETURN
插入列ret\u 3mth
这就是我所拥有的,但是它没有正确地执行更新。连接似乎正在工作,因为它匹配了正确的行数,但它不会更改任何行
*更新*
UPDATE
price_returns AS curr
LEFT OUTER JOIN
price_returns AS mo3
ON
((curr.date = LAST_DAY(mo3.date - INTERVAL 3 MONTH)) AND (curr.company = mo3.company))
LEFT OUTER JOIN
price_returns AS mo6
ON
((curr.date = LAST_DAY(mo6.date - INTERVAL 6 MONTH)) AND (curr.company = mo6.company))
SET
curr.ret_3mth = (mo3.price - curr.price)/curr.price,
curr.ret_6mth = (mo6.price - curr.price)/curr.price;
不知道为什么,但下面的代码现在似乎正在工作。很抱歉给你带来了困惑。我还没有弄清楚到底发生了什么,为什么没有,但现在它正在起作用。我肯定是用户错误
*更新*
UPDATE
price_returns AS curr
LEFT OUTER JOIN
price_returns AS mo3
ON
((curr.date = LAST_DAY(mo3.date - INTERVAL 3 MONTH)) AND (curr.company = mo3.company))
LEFT OUTER JOIN
price_returns AS mo6
ON
((curr.date = LAST_DAY(mo6.date - INTERVAL 6 MONTH)) AND (curr.company = mo6.company))
SET
curr.ret_3mth = (mo3.price - curr.price)/curr.price,
curr.ret_6mth = (mo6.price - curr.price)/curr.price;
谢谢您的帮助。您可以使用子查询来完成此操作(http://dev.mysql.com/doc/refman/5.0/en/subqueries.html)
所以在括号中有一个子查询,您将通过上面的整个select代码(第一个mysql代码)谢谢您的帮助,很高兴看到另一种方法。我刚刚再次尝试了原始代码,它现在可以工作了。我不知道我以前做过什么错事,我试过了。谢谢你的帮助,非常感谢。