2015-01-29 1 views
1

У меня есть две таблицы «Контейнер» и «Контроль». Это существующие таблицы, и между ними нет отношения внешнего ключа. Это также очень старые таблицы, поэтому они не нормализованы. И теперь я не могу изменить структуру.SQL-сервер: вставка/обновление отсутствующих данных из одной таблицы в другую

Ниже представлена ​​структура двух таблиц.

Контейнер стол:

enter image description here

управления Таблица: enter image description here

Имя поля в таблице управления содержит CTableName + CPName из контейнера таблицы.

Я хочу обновить поле columnName таблицы Control со значением столбца CID таблицы Container. а также хотите вставить еще одну запись (для таблицы ctable2, а именно четвертую строку в финальной контрольной таблице ниже) в таблице управления.

В столбцах имен таблиц и столбцов всегда будут значения по умолчанию.

Финальный стол управления должен выглядеть следующим образом:

enter image description here

Как это сделать?

+1

Посмотрите в https://msdn.microsoft.com/en-us/library/bb510625.aspx – Mihai

+0

Где ваша новая вставленная строка для ctable2? – SMA

+0

«Поле Name в контрольной таблице содержит CTableName + CPName из таблицы контейнеров», это страшная идея, вы действительно должны иметь 2 столбца вместо – Lamak

ответ

0

Надеюсь, вы хотите применить это исправление, потому что хотите нормализовать структуру таблицы.

Попробуйте это:

Первый шаг:

Таким образом, вы будете обновлять все строки управления со значением таблицы Container, где пара полей CTableName и CPName такие же наименования (за исключением строк в контейнер с той же парой полей)

UPDATE Control 
SET ColumnValue = (
    SELECT c.CID 
    FROM Container c 
    WHERE c.CTableName + '+' + c.CPName = Control.Name 
    AND NOT EXISTS(
     SELECT 'PREVIOUS' 
     FROM Container c2 
     WHERE c.CTableName = c2.CTableName 
     AND c.CPName = c2.CPName 
     AND c.CID < c2.CID 
    ) 
), 
TableName = 'default', ColumnName = 'default' 
WHERE ColumnValue IS NULL 

Второй шаг:

Добавление элементов не присутствует в таблице управления

INSERT INTO Control (field list) 
SELECT field list 
FROM Container co 
WHERE NOT EXISTS(
    SELECT 'in_control' 
    FROM Control ct 
    WHERE co.CID = ct.ColumnValue 
) 

После этих двух шагов вы можете оставить столбец Имя в таблице управления

+0

Спасибо за ответ. Я попробую. – sid

+0

Я не хочу нормализовать таблицу. Я просто хочу вставить данные – sid

+0

@sid: последнее слово - ваше;) Но два вопроса в порядке? –

-1

Я программист Oracle plsql и работал с Sql-сервером.

Сначала вы должны описать взаимосвязь между двумя таблицами, в конце концов я смогу ее вычеркнуть, но лучше объяснить это самостоятельно. Чтобы обновить таблицу информацией из другой таблицы, вы должны задать себе вопрос: - когда должно произойти обновление? - Каковы условия для запуска обновления? - как должно быть сделано обновление?

В Oracle есть объект базы данных, называемый триггером. Это довольно удобный объект и, вероятно, именно то, что вам нужно. Я считаю, что у SQL-сервера это тоже.

Плата за регистрацию бесплатна, чтобы задать любые вопросы, но также прочитать соответствующее руководство по sql-серверу.

Удачи, Эдвард.

Смежные вопросы