2012-09-13 94 views
1

我試圖找出如何在一個表中更新一行,設置列值等於在不同的表中的值。這裏有一個例子:如何設置列值等於另一個表中的值?

movies: 

movie_id | movie_price 

movies_attended: 

attended_id | attended_movie_id | attended_movie_price 

現在,這是怎樣的一個愚蠢的例子,但認爲由於某種原因存在movies_attended的行不具有它的正確attended_movies_price,所以它需要更新。

應該如何查詢被寫入更新movies_attended表,設置movies_attended.attended_movie_price = movies.movi​​e_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] 

回答

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 ... FROM更換UPDATE關鍵字,並移除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 = ? 
+0

是的,它說,更換之星「受影響的0行。」嘗試了你的替代語法,但它說了同樣的事情。 – Nate

+0

我收回它,它確實工作!我的一個錯誤..感謝您的幫助! – Nate

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 
+0

在我的應用程序實際上做,作爲基準價格隨時間變化。我沒有嘗試你的解決方案,因爲它沒有更新單行。它看起來好像會更新所有行。 – Nate

+1

這未必是一個壞的數據庫設計,它可能是'movies'表包含當前的標準價格,那'movies_attended'表中包含的歷史價格,價格實際上在電影出席的時間。在這種情況下,這不是一個錯誤的數據庫設計,但假設'movies_attended'中的每一行的價格都與'movies'表中的當前'price'相匹配是錯誤的。 – spencer7593

+0

我誤解了你,對不起。你只需要添加WHERE movies_attended.attended_movie_id = *在聲明的最後,有一個實際的影片ID – Codeforest

相關問題