有谁能告诉我,我的逻辑在以下两条mysql语句中的哪一条/哪两条都有错误?

有谁能告诉我,我的逻辑在以下两条mysql语句中的哪一条/哪两条都有错误?,sql,mysql,Sql,Mysql,我想用jobs表中的principal_staff_ID更新staff_used表中的principal_staff_ID列。这两个表通过一个公共作业ID进行关联 第一次尝试: update staff_used su set su.principal_staff_ID = (select j.principal_staff_ID from job j where j.job_ID = su.job_ID); 第二次尝试: upd

我想用jobs表中的principal_staff_ID更新staff_used表中的principal_staff_ID列。这两个表通过一个公共作业ID进行关联

第一次尝试:

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;

第二种形式应该有效。您可以尝试以下表单:

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

如果第二次尝试无效,请尝试以下操作:(不确定MySQL是否支持此语法?)


对于第一个查询,必须在作业表中为Staff_Used表中的每一行设置一行,否则DBMS将为每一个不匹配的行将Staff_Used.Principal_Staff_ID值设置为NULL。要使这种形式的更新安全,您必须编写:

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);

第二个子查询确保仅更新Staff_中与Job中的匹配行一起使用的行。这也是一个很好的理由,喜欢加入符号

你遇到了什么麻烦?解释你在哪里遇到问题总是有帮助的,可能是一个确切的错误信息(如果是这样的话),或者解释一个似乎有效的语句的不良副作用。@Jonathan Leffler:谢谢你们。第二个表单确实有效(最终),但我必须删除j.job_ID下的一个未设置字段。浏览器返回的错误查询为“principal_staff_ID不能为null”,但问题的原因似乎是没有设置j.job_ID。我现在有一个更新加入的例子,这将帮助我理解-谢谢。我希望在适当的时候能更好地理解为什么子查询不起作用,因为在某些方面它似乎更符合逻辑。@SaminOz:如果米奇的答案对你有帮助,他的答案应该得到你的支持票。如果有几个有用的答案,你可以投多个答案。
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);