1

列の値を別のテーブルの値と等しく設定して、あるテーブルの行を更新する方法を理解しようとしています。次に例を示します。

movies:

movie_id | movie_price

movies_attended:

attended_id | attended_movie_id | attended_movie_price

さて、これは一種のばかげた例ですが、何らかの理由で、movies_attendedに正しいattended_movies_priceが含まれていない行があるため、更新する必要があると想定されます。

movies_attended.attended_movie_price = movies.movi​​e_priceを設定して、movies_attendedテーブルを更新するクエリをどのように作成する必要がありますか?

次のようなものを試しましたが、機能しませんでした。

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]
4

2 に答える 2

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 = ?
于 2012-09-13T18:01:19.590 に答える
0

これは実際には悪いデータベース設計です。2つのテーブルで映画の価格は必要ありません。

しかし、これが必要な場合は、次のようになります。

UPDATE movies_attended
INNER JOIN
movies
ON movies_attended.attended_movie_id = movies.movie_id
SET movies_attended.attended_movie_price = movie.movie_price
于 2012-09-13T17:54:44.603 に答える