SQL Можно ли настроить столбец, который будет содержать значение, зависящее от другого столбца? - PullRequest
0 голосов
/ 19 марта 2010

У меня есть таблица (A), в которой перечислены все пакеты, созданные на машине за день. В нем перечислены дата создания и вес комплекта. У меня есть столбец идентификатора, столбец даты и столбец веса. У меня также есть таблица (B), которая содержит детали, относящиеся к этой машине за день. В этой таблице (B) я хочу столбец, в котором указана сумма весов из другой таблицы (A), по которой совпадают даты. Поэтому, если машина запускает 30 пакетов в день, у меня будет 30 строк в таблице (A), все они датированы одним днем. В таблице (B) у меня будет 1 строка, детализирующая другую информацию о машине за день, плюс столбец, который содержит общий вес пачки, созданный за день.

Есть ли способ сделать так, чтобы общий столбец в таблице (B) автоматически корректировался при добавлении строки в таблицу (A)? Можно ли это сделать в самой схеме таблицы, а не в операторе SQL при каждом добавлении пакета? Если нет, то какой SQL-оператор мне нужен?

Wes

Ответы [ 4 ]

4 голосов
/ 19 марта 2010

Это было бы ошибкой, если у вас нет проблем с производительностью, которые требуют этого.

Лучший подход - определить представление в базе данных, которое будет агрегировать ежедневные пакеты по машинам:

 CREATE VIEW MachineDailyTotals
     (MachineID, RunDate, BundleCount, TotalWeight)
 AS SELECT MachineID, RunDate, COUNT(*), SUM(WeightCol)
 FROM BundleListTable
 GROUP BY MachineID, RunDate

Это позволит вам всегда видеть правильный, обновленный общий вес на машину в день без нагрузки на базу данных до тех пор, пока вы фактически не посмотрите на данные. Вы можете выполнить простое ВНЕШНЕЕ СОЕДИНЕНИЕ с таблицей станка, чтобы получить информацию об аппарате, включая ежедневную общую информацию, без необходимости хранить итоговые значения где-либо.

1 голос
/ 19 марта 2010

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

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

1 голос
/ 19 марта 2010

Если вам нужна сумма (или другая совокупность) в реальном времени, добавьте триггер в таблицу A для INSERT, UPDATE, DELETE, который вычисляет сумму, которая будет сохранена в B.

В противном случае добавьте ежедневнуюзадание, которое вычисляет суммы.

Пожалуйста, укажите, какую базу данных вы используете.

0 голосов
/ 19 марта 2010

Это может быть выполнено с помощью триггеров, представляющих собой небольшие кусочки кода, которые выполняются всякий раз, когда в таблице происходит определенное действие (вставка / обновление / удаление) Синтаксис зависит от поставщика (MySQL против Oracle), но обычно это тот же язык, на котором вы написали бы хранимую процедуру.

Если вы упомянете тип БД, я могу помочь с фактическим синтаксисом

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...