使用JOIN进行更新而不选择期望值

时间:2019-01-12 19:14:33

标签: sql-update mariadb where-clause

我正在尝试使用馆藏表中的值更新临时交易表。我要获取的字段来自日期高于交易日期的最低日期的馆藏。

当我在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语句中使用时,在transaction_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 :(得分:1)

应该使用子查询

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

答案 1 :(得分:0)

我很惊讶您的语法有效。 MySQL文档非常清楚,LIMITORDER BY仅在存在单个表引用的情况下才允许使用:

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。

如果尝试使用这种语法,则会出错。