2011-02-10 5 views
0

나는 두 테이블 (마스터, 응답)가도움말 업데이트 SQL

나는 응답 테이블에서 Master_Id 필드를 사용하여 기록을 일치하는 마스터 테이블 (ID)에 그것을보고와의 날짜 필드를 업데이트해야합니다

마스터 테이블의 ID 필드 링크가 테이블의 Master_id 필드

Reponses에 대한 응답 테이블의 날짜 필드에 마스터 테이블이는 SQL에서 할 수 ????

UPDATE Master m SET m.date = (
    SELECT r.date FROM Reponses r WHERE r.master_id = m.id) 
WHERE m.id IN (SELECT master_id FROM Responses) 

일반 SQL 오류 - 단일 행 선택에 여러 행이 표시됩니다.

가입을 추가하거나 변경해야합니까?

답변

3

오류를 시도 할 수있다 특정 마스터 레코드가 하나 개 이상의 응답이 경우는, 날짜를 얻을 수있는 하위 쿼리가 하나 개 이상의 행을 반환하는 것을 의미한다. 아시다시피 서버에는 올바른 응답을 선택하고 마스터 테이블을 업데이트하는 논리가 없습니다 (날짜가 다를 수도 있고 아는 것도 아님). 오류 메시지가 표시됩니다.

하위 쿼리가 한 행만 반환하도록하려면 마스터 테이블에서 응답 날짜를 선택하는 데 필요한 정확히 한 행을 지정해야합니다. 모든 응답 행에 동일한 날짜가 포함되어 있으면 @cyberkiwi에서 제안한 것처럼 FIRST 절을 사용하여 첫 번째 행만 반환 할 수 있습니다.

하지만 당신은 최신을 선택 할 수 있습니다하는 기준에 따라 가장 오래된 또는 기타 :

이 모든 오류 메시지가 표시되지 않습니다, 올바른이 필요에 따라 뿌려되지 않을 수 있습니다

UPDATE Master m SET m.date = (
    SELECT FIRST 1 r.date FROM Reponses r WHERE r.master_id = m.id) 
WHERE m.id IN (SELECT master_id FROM Responses) 

UPDATE Master m SET m.date = (
    SELECT MAX(r.date) FROM Reponses r WHERE r.master_id = m.id) 
WHERE m.id IN (SELECT master_id FROM Responses) 

UPDATE Master m SET m.date = (
    SELECT MIN(r.date) FROM Reponses r WHERE r.master_id = m.id) 
WHERE m.id IN (SELECT master_id FROM Responses) 

UPDATE Master m SET m.date = (
    SELECT r.date FROM Reponses r WHERE r.master_id = m.id AND r.accepted = 1) 
WHERE m.id IN (SELECT master_id FROM Responses) 
1

먼저

UPDATE Master m SET m.date = (
    SELECT FIRST 1 r.date FROM Responses r WHERE r.master_id = m.id) 
WHERE m.id IN (SELECT master_id FROM Responses) 
+0

FIRST? 확실하지 그게 내가 마스터 테이블에 날짜 필드를 사용하여 응답 테이블에서 ID가 일치하는 모든 날짜 fied 레코드를 업데이 트하는 데 도움이 될까요? ???????? – IElite

+1

@Shane 응답에서 각 master_id에 대해 - Master에서 레코드를 찾습니다. 마스터의 해당 레코드를 사용하여 (m.id 당 하나만 있음), FIRST 응답 날짜로 업데이트하십시오. 마스터마다 여러 응답을했기 때문에 오류가 발생했습니다. '1'마스터 레코드를'X '날짜로 업데이트 할 수 없습니다. 그것이 바로 FIRST의 목적입니다. – RichardTheKiwi