Что такое правильный способ иметь представление корректировок между двумя таблицами в SQL - PullRequest
4 голосов
/ 09 февраля 2010

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

Я думаю, что я в основном сделал бы представление (vAdjustedData) таким, чтобы эти данные были объединены вместе, давая мне источник, который был самой последней версией данных. (Цель этого состоит в том, чтобы позволить пользователям отменить свои данные в скорректированной таблице и вернуть данные основных таблиц в текущее состояние).

Столбцы в таблицах будут обнуляться. Идея состоит в том, что, когда пользователь желает внести изменения, в это время основная запись будет скопирована, изменения применены, а затем сохранены в таблице корректировок. Моя идея UNION заключалась бы в том, чтобы замаскировать исходную основную запись с откорректированной записью так, чтобы при размещении в представлении я получал «текущие» данные. Когда эта настройка удалена, представление «автоматически» откатится назад.

Итак, у меня есть Table_Master и Table_Adjusted. Table_Master имеет первичный ключ. Table_Adjusted также имеет первичный ключ, но он является внешним ключом первичного ключа Table_Master. Если бы в обеих таблицах был столбец varchar, я хотел бы написать представление, похожее на это:

(SELECT ID, Value
FROM Table_Adjusted)
UNION
(SELECT ID, Value
FROM Table_Master
WHERE ID NOT IN (SELECT ID FROM Table_Adjusted))

Приведенный выше UNION должен принести все скорректированные значения, а затем все значения из мастера, у которых не было записи о корректировке.

Это правильный способ сделать это? Мне это кажется неэффективным. Я думал, что ИСКЛЮЧЕНИЕ будет работать (с использованием SQL2K8), но это не представляется целесообразным.

1 Ответ

2 голосов
/ 09 февраля 2010

Я предполагаю, что вы хотите, чтобы скорректированная таблица только настраивала значения, а не добавляет или удаляет значения. Недостатком вашего запроса является то, что теоретически возможно добавлять новые значения, которых даже нет в исходной таблице. Эта версия предотвращает этот возможный риск:

SELECT Table_Master.ID,
    CASE WHEN Table_Adjusted.ID IS NULL THEN Table_Master.Value
         ELSE Table_Adjusted.Value
    END AS Value
FROM Table_Master
LEFT JOIN Table_Adjusted
ON Table_Master.ID = Table_Adjusted.ID

Также ваш запрос использует UNION DISTINCT, но на самом деле вам нужен только UNION ALL. Эта слегка измененная версия вашего запроса должна выполняться немного быстрее:

SELECT ID, Value
FROM Table_Adjusted
UNION ALL
SELECT ID, Value
FROM Table_Master
WHERE ID NOT IN (SELECT ID FROM Table_Adjusted)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...