我正在尝试使用馆藏表中的值更新临时交易表。我要获取的字段来自日期高于交易日期的最低日期的馆藏。
当我在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
答案 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文档非常清楚,LIMIT
和ORDER 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。
如果尝试使用这种语法,则会出错。