2011-01-03 2 views
0

staff_used 테이블의 principal_staff_ID 열을 jobs 테이블의 principal_staff_ID로 업데이트하려고합니다. 이 두 테이블은 공통 job_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; 
+0

두 번째 양식이 작동해야합니다. –

+0

어떤 문제가 발생 했습니까? 항상 정확한 오류 메시지 (문제가 발생한 경우) 또는 작동하는 것으로 보이는 명령문의 바람직하지 않은 부작용에 대한 설명과 함께 문제가 발생한 위치를 설명하는 데 도움이됩니다. –

답변

0

을, 당신은 있어야합니다 Employee 테이블의 모든 행에 대해 작업 테이블의 행을 찾습니다. 그렇지 않으면 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); 

제 2 서브 쿼리 작업에 일치하는 행이 Staff_Used 만 행이 업데이트되는 것을 보장 : UPDATE의 형태가 안전하려면, 당신은 작성해야합니다. 조인 노테이션을 선호하는 것도 좋은 이유입니다!

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 : 감사합니다. 두 번째 형식은 (결국) 작동했지만 j.job_ID 아래의 설정되지 않은 필드를 삭제해야했습니다. 반환 된 오류 쿼리 브라우저는 "principal_staff_ID가 null 일 수 없습니다."하지만 문제의 원인은 설정되지 않은 j.job_ID 인 것 같습니다. 이제는 이해에 도움이 될 조인으로 업데이트하는 예가 있습니다. 감사합니다. 나는 서브 쿼리가 작동하지 않는 이유에 대해 좀 더 논리적 인 것처럼 느껴질 수 있기를 바랍니다. – SaminOz

+0

@SaminOz : 미치의 대답이 도움이된다면, 그의 대답은 당신의지지를 얻을 자격이 있습니다. 도움이되는 답변이 여러 개있는 경우 하나 이상의 답변에 대해 유상 투표 할 수 있습니다. –

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 
관련 문제