ОБНОВЛЕНИЕ с JOIN не ВЫБИРАЕТ ожидаемое значение - PullRequest
0 голосов
/ 12 января 2019

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

Когда я использую оператор SELECT ниже, отображаются правильные значения:

SELECT h.*
FROM transaction_tmp tt
    JOIN holdings h
        ON tt.isin = h.isin
            AND tt.portfolio = h.portfolio
    WHERE h.start_date > tt.tr_date
    ORDER BY h.start_date
    LIMIT 1

Однако, когда я использую приведенную ниже инструкцию UPDATE, неверные значения выбираются / обновляются в транзакции_tmp:

UPDATE transaction_tmp tt
    JOIN holdings h
        ON tt.isin = h.isin
            AND tt.portfolio = h.portfolio
    SET
        tt.next_id = h.id,
        tt.next_start_date = h.start_date
    WHERE h.start_date > tt.tr_date
    ORDER BY h.start_date
    LIMIT 1

Я думаю, что утверждение WHERE не работает должным образом, но, к сожалению, я не могу понять, как это исправить.

Цените любую помощь здесь! -Joost

Ответы [ 2 ]

0 голосов
/ 12 января 2019

должно работать с использованием подзапроса

UPDATE transaction_tmp tt
JOIN  (
  SELECT h.*
  FROM transaction_tmp tt
  JOIN holdings h
      ON tt.isin = h.isin
          AND tt.portfolio = h.portfolio
  WHERE h.start_date > tt.tr_date
  ORDER BY h.start_date
  LIMIT 1

) tx on ON tt.isin = tx.isin
          AND tt.portfolio = tx.portfolio

 SET
    tt.next_id = tx.id,
    tt.next_start_date = tx.start_date
0 голосов
/ 12 января 2019

Я удивлен, что ваш синтаксис работает. Документация по MySQL достаточно ясна, что LIMIT и ORDER BY разрешены только при наличии ссылки на таблицу single :

UPDATE [LOW_PRIORITY] [IGNORE] table_reference
    SET assignment_list
    [WHERE where_condition]
    [ORDER BY ...]
    [LIMIT row_count]

Они не разрешены для версии с несколькими таблицами UPDATE:

UPDATE [LOW_PRIORITY] [IGNORE] table_references
    SET assignment_list
    [WHERE where_condition]

. , , Для синтаксиса с несколькими таблицами UPDATE обновляет строки в каждой таблице, названной в table_references, которые удовлетворяют условиям. Каждая соответствующая строка обновляется один раз, даже если она соответствует условиям несколько раз. Для синтаксиса с несколькими таблицами нельзя использовать ORDER BY и LIMIT.

Я получаю сообщение об ошибке, если попробую такой синтаксис.

...