我试图弄清楚如何更新一个表中的行,将列值设置为等于另一个表中的值。这是一个例子:
movies:
movie_id | movie_price
movies_attended:
attended_id | attended_movie_id | attended_movie_price
现在,这是一个愚蠢的例子,但是假设由于某种原因,movies_attended中有一行没有正确的attend_movies_price,因此需要更新。
如何编写查询来更新movies_attended表,设置movies_attended.attended_movie_price = movies.movie_price?
我尝试了类似下面的内容,但它不起作用:
update movies_attended, movies
set movies_attended.attended_movie_price = movies.movie_price
where movies_attended.attended_movie_id = movies.movie_id
AND attended_id = [the id of the row we want to update]
答案 0 :(得分:3)
当你说“它不起作用”时,你的意思是它报告了0行更新,或者该语句是否导致数据库引发异常?
您的示例语句似乎是以下形式:
UPDATE movies_attended a
JOIN movies m
ON a.attended_movie_id = m.movie_id
SET a.attended_movie_price = m.movie_price
WHERE a.attended_id = ?
(我们通常更喜欢JOIN ... ON ...
样式语法到逗号连接运算符和WHERE子句中的连接谓词。)
我没有解释为什么这句话“不起作用”。
如果没有行满足谓词,则可能会报告受影响的0行。如果要更改的行不需要任何更改,它也会报告受影响的0行...也就是说,attended_movie_price
中的现有值已经与分配给它的值匹配。
通常,在运行类似的更新语句之前,我先将其写为SELECT,然后查看返回的值...
将UPDATE
关键字替换为SELECT ... FROM
,并删除SET
子句:
SELECT m.movie_price AS new_val
, a.attended_movie_price AS old_val
, a.attended_id
FROM UPDATE movies_attended a
JOIN movies m
ON a.attended_movie_id = m.movie_id
WHERE a.attended_id = ?
答案 1 :(得分:0)
这实际上是一个糟糕的数据库设计。你不需要在两张桌子上看电影价格。
但是,如果你只是需要这个,那就是这个:
UPDATE movies_attended
INNER JOIN
movies
ON movies_attended.attended_movie_id = movies.movie_id
SET movies_attended.attended_movie_price = movie.movie_price