2010-07-28 2 views
0

비 관계형 테이블을보다 관계형 테이블로 변환하고 외래 키를 지원하는 데 가장 적합한 Transact-SQL을 알아 내려고합니다.T-SQL - 정규화되지 않은 데이터에서 새 외래 키 관계 만들기

INSERT INTO USSTATE (Name) Select DISTINCT USState from FRUIT 

지금은이 테이블 USSTATE

Id  Name 

    1  Alabama 
    2  Alaska 

etc. 
: 나는 테이블 과일

Id Name  USState 

    1 Apple  Washington 
    2 Pineapple Hawaii 
    3 Orange  Florida 
    4 Peach  Georgia 

etc 

이 있다고 가정

나는 미국이 자신의 ID로 테이블 이름되고 싶어

USSTATE의 ID를 재귀 적으로 가리 키도록 FRUIT 테이블의 USState 값을 어떻게 업데이트합니까?

나는

DECLARE @USSTATE nvarchar(100) 
Set @USSTATE = 'Alabama' 
Update FRUIT Set USState = (SELECT Id from USSTATE where Name like @USSTATE) 
Set @USSTATE = 'Alaska' -- do this for each State? Arghh!!! 

등 등

주하여 주 작업을 수행 할 수 있습니다,하지만 난 재귀 적으로 그것을 할 싶어. 어떤 도움을 주셔서 감사합니다?

답변

4
UPDATE F 
SET F.USState = S.ID 
FROM FRUID AS F 
INNER JOIN USSTATE AS S ON F.USState = S.Name 
0

나는 그러나, 귀하의 예제 데이터가 그래서 당신은 일대일 관계를 생성 할 것 ... 한 상태로 하나 개의 열매를 묶는 T-SQL 을주는 나의 위의 대답을 투표했다. 귀하의 질문과는 대조적으로 귀하의 데이터는 이미 정규화되어 있습니다 (포함하지 않은 테이블에 중복되거나 여러 과일이있는 경우는 제외)

+0

예 동의, 난 단지에 노력했다 간단한 예제를 제공하십시오. 실제 문제에는 다른 복잡한 측면이 있습니다. 감사! –

0

외래 키가있는 새 열을 USState 테이블로 보내고 싶습니다. ?

FRUIT 테이블에 새 열을 작성하여 시작하십시오 ("USStateId"라고 함). 일시적으로 컬럼을 널 (NULL) 입력 가능하게해야합니다.

그런 다음 USState.Id와 Fruit.USStateId의 FK 관계를 만듭니다.

그런 다음 올바른 값으로 새 열을 업데이트 할 쿼리를 작성 :

--(untested but should be close) 
UPDATE f 
SET f.USStateId = s.Id 
FROM Fruit f 
INNER JOIN USState s ON f.USState = s.Name 

다음, 당신은 null이 허용되지 않는 추가 한 새 열을 확인합니다.

마지막으로 Fruit 테이블에서 USState 열을 제거하십시오.

관련 문제