T-SQL - создать новое отношение внешнего ключа из ненормализованных данных - PullRequest
0 голосов
/ 29 июля 2010

Я пытаюсь найти лучший Transact-SQL для преобразования нереляционных таблиц в таблицы, которые являются более реляционными и поддерживают внешние ключи.

Предположим, у меня есть таблица ФРУКТОВ

    Id  Name        USState

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

etc

Я хочу, чтобы Штаты были их собственной таблицей с идентификатором и именем:

INSERT INTO USSTATE (Name) Select DISTINCT USState from FRUIT

Теперь у меня есть таблица USSTATE

    Id      Name

    1       Alabama
    2       Alaska

etc.

Как мне теперь обновить значение USState в таблице 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 ]

4 голосов
/ 29 июля 2010
UPDATE F
SET F.USState = S.ID
FROM FRUID AS F
INNER JOIN USSTATE AS S ON F.USState = S.Name
1 голос
/ 29 июля 2010

Не каждая база данных поддерживает JOIN в синтаксисе UPDATE - коррелированный подзапрос - самый переносимый подход:

UPDATE FRUIT
   SET usstate = (SELECT us.id 
                    FROM USSTATE us
                   WHERE us.name = usstate)

Помните, что обновляет тип данных для столбца FRUIT.usstate из VARCHAR /и т.д. до INT :

ALTER TABLE FRUIT
ALTER COLUMN usstate INT NOT NULL
0 голосов
/ 29 июля 2010

Вам нужен новый столбец с внешним ключом для таблицы USState, это правильно?

Начните с создания нового столбца в таблице FRUIT (назовите его «USStateId»). Вам придется временно сделать столбец обнуляемым.

Затем создайте взаимосвязь FK с помощью USState.Id и Fruit.USStateId.

Затем напишите запрос для обновления нового столбца правильными значениями:

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

Далее, сделайте новый столбец, который вы добавили, необнуляемым.

Наконец, удалите столбец USState из таблицы Fruit.

0 голосов
/ 29 июля 2010

Я проголосовал над ответом выше моего за то, что дал T-SQL. Однако ваши данные в качестве примера связывают один фрукт с одним состоянием ... так что вы бы создали отношение один к одному.В отличие от вашего вопроса, ваши данные уже нормализованы (если в таблице нет дублированных или нескольких фруктов, которые вы не включили)

...