Преобразуйте mysql SELECT с помощью OUTER JOIN в ОБНОВЛЕНИЕ - PullRequest
2 голосов
/ 31 января 2012

Я пытаюсь обновить таблицу, содержащую информацию о ценах на акции, чтобы они включали доходности этих акций, если они хранятся в разные периоды времени. Возврат вставляется в начале периода времени. Следующая инструкция SELECT вычисляет значения, которые я ищу, для периодов удержания 3 и 6 месяцев. Таблица price_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_returns и вставить 3MONTH_RETURN и 6MONTH_RETURN в столбцы ret_3mth и ret_6mth.

Это то, что у меня есть, но обновление выполняется неправильно. Объединение, кажется, работает, поскольку оно соответствует правильному количеству строк, но не меняет никаких строк.

* Обновление *

Не уверен, почему, но этот код ниже, похоже, работает. Извините за путаницу. Я до сих пор не выяснил, что случилось и почему это не так, но сейчас работает. Ошибка пользователя. Я уверен.

* Обновление *

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;

Спасибо за вашу помощь.

1 Ответ

2 голосов
/ 31 января 2012

вы можете сделать это, используя подзапрос (http://dev.mysql.com/doc/refman/5.0/en/subqueries.html)

UPDATE price_returns SET curr.ret_3mth = (SELECT (mo3.price - curr.price)/curr.price in here with the join), 
curr.ret_6mth = (Select (mo6.price - curr.price)/curr.price in here with the join)

Так что в скобках есть подзапрос, где вы должны были бы пропустить весь код выбора, который у вас есть выше (первый код mysql)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...