2011-05-07 4 views
0

잘못된 상태가있는 멤버 테이블을 가져 왔습니다. State Abbreviation을 갖는 대신 완료된 State Name을 포함합니다.JOIN 및 인사이드 쿼리를 사용하여 테이블 업데이트

아래 쿼리 작업을 수행하고 Members.StateName 및 State.Abbreviation을 끌어 :

이제
Connecticut CT 
Maryland MD 
Massachusetts MA 

나는 내가 State.Abbreviation로 Members.StateName를 교체하고 명령을 작성하고 업데이트하는 것을 시도하고있다 .

UPDATE dbo.Members 
SET memState = (SELECT s.stAbv FROM dbo.State AS s 
JOIN Members AS m ON s.stName = m.memState) 
WHERE memState NOT IN (SELECT s.stAbv FROM dbo.State AS s) 

ERROR : 부질는 1 개 이상의 값을 반환. 하위 쿼리가 =,! =, <, < =,>,> = 또는 하위 쿼리가 식으로 사용될 때 하위 쿼리가 수행되는 경우에는 허용되지 않습니다.

명세서가 종료되었습니다. 오류로 인해 내부 쿼리가 여러 행을 반환하므로 업데이트 할 수 없다는 것을 이해합니다. 어떻게 작동 시키나요?

+0

dbo.State에 같은 이름의 상태 행이 두 개 이상 있습니까? 그렇다면 삭제 된/삭제 된 것으로 표시되거나 특정 국가에 묶여서는 안되며, 미국 주, 영국 카운티 등이 테이블에 있다면? –

+0

아래 코드 = MEMSTATE NOT IN (들을 선택 WHERE (1 s.stAbv dbo.State AS의 가 s.stName m.memState = ON m AS 회원 가입 FROM TOP SELECT) 업데이트 dbo.Members SET MEMSTATE 근무 .stAbv FROM dbo.State AS s) –

+0

그래도 그게 옳은거야? TOP 1에 의해 반환 된 약어는 '올바른'상태의 약어일까요? 왜 당신은 당신의 탁자에 특정 이름의 주를 1 개 이상 가지고 계셨습니까? –

답변

2

난 당신이 이런 식으로 그것을 할 수 있다고 생각.

0

memState에 두 개 이상의 값을 할당 할 수 없습니다. 하나의 값에 중복 값을 결합하려면 SELECT DISTINCT를 시도하십시오. 당신의 WHERE 절에 대해

UPDATE m 
SET memState = s.stAbv 
FROM dbo.Members AS m 
    INNER JOIN dbo.State AS s ON s.stName = m.memState 

완전히 확실하지,하지만 대부분의 아마 필요 아니에요 :

관련 문제