2011-01-03 4 views
0

私は、staff_usedテーブルのprincipal_staff_IDカラムをjobsテーブルのprincipal_staff_IDで更新したいと考えています。これらの2つのテーブルは、共通のjob_IDを介して関連しています。誰かが私の論理がどこに/次の両方のmysqlステートメントのどこに欠陥があるのか​​を教えてくれますか?

初の試み:

update staff_used su 
set su.principal_staff_ID = (select j.principal_staff_ID 
           from job j where j.job_ID = su.job_ID); 

第二の試み:

update staff_used su 
join job j on j.job_ID = su.job_ID 
set su.principal_staff_ID = j.principal_staff_ID; 
+0

第2のフォームは動作するはずです –

+0

あなたは遭遇した問題は何ですか?常に問題が発生した場所を説明し、場合によっては正確なエラーメッセージ(起こったことがある場合)や、動作していると思われるステートメントの望ましくない副作用について説明することが役立ちます。 –

答えて

0

最初のクエリでは、あなたが持っている必要がありますStaff_Usedテーブル内のすべての行について、Jobテーブル内の行を削除するか、DBMSは、不一致の行ごとにStaff_Used.Principal_Staff_ID値をNULLに設定します。 UPDATEのそのフォームを安全にするために、次のように記述する必要があります。

UPDATE staff_used su 
    SET su.principal_staff_ID = (SELECT j.principal_staff_ID 
            FROM job j 
            WHERE j.job_ID = su.job_ID) 
WHERE su.principle_staff_ID IN (SELECT j.principal_staff_ID 
            FROM job j 
            WHERE j.job_ID = su.job_ID); 

第2の副問合せは、仕事で一致する行とStaff_Usedの行のみが更新されることが保証されます。また、結合表記を好む理由もあります。

1

二番目の形式は動作するはずです。あなたは、このフォームを試みることができる:

update staff_used 
set su.principal_staff_ID = j.principal_staff_ID  
from staff_used su 
inner join ww_job j on j.job_ID = su.job_ID 
+0

@Jonathan Leffler:ありがとう。 2番目のフォームが機能しましたが(最終的には)、j.job_IDの下にある未設定のフィールドを削除しなければなりませんでした。返されたエラークエリーブラウザは "principal_staff_IDはnullにはできません"でしたが、問題の原因は設定されていないj.job_IDのようでした。私は今、私が理解する助けになる結合で更新する例を持っています - ありがとう。私は、サブクエリがうまくいかなかった理由をより良く感じるために、当然のことながら、いくつかの点でより論理的なように思っています。 – SaminOz

+0

@SaminOz:ミッチの答えがあなたを助けたら、彼の答えはあなたからの投票に値する。いくつかの有益なものがあれば、1つ以上の回答を上書することができます。 –

1

第二の試行が動作しない場合は、この試してみてください。(?MySQLはこの構文をサポートしている場合わからないが)

update su 
set su.principal_staff_ID = j.principal_staff_ID 
from staff_used as su 
inner join job j on j.job_ID = su.job_ID 
関連する問題