Поле SQL как сумма других полей - PullRequest
4 голосов
/ 25 ноября 2010

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

В качестве примера у меня есть две таблицы:

Рецепты

nrecepie integer
name varchar(255)
time integer

и другие

Инструкция

nintrucion integer
nrecepie integer
time integer

Итак, в основном, поскольку в рецепте есть n инструкций, я бы хотел, чтобы это было

recipes.time = sum(intructions.time)

Возможно ли это сделать в скрипте создания таблицы ?? если да, то как?

Ответы [ 5 ]

4 голосов
/ 25 ноября 2010

Вы можете использовать представление:

CREATE VIEW recipes_with_time AS
SELECT nrecepie, name, SUM(Instructions.time) AS total_time
FROM Recepies
JOIN Instructions USING (nrecepie)
GROUP BY Recepies.nrecepie

Если вы действительно хотите, чтобы эти данные были в реальной таблице, вы должны использовать триггер.

2 голосов
/ 25 ноября 2010

Это можно сделать с помощью триггера INSERT/UPDATE/DELETE. Каждый раз, когда данные изменяются в таблице Instructions, триггер запускается и обновляет время value в Recepies.

0 голосов
/ 25 ноября 2010

В общем, вы хотите избежать подобных ситуаций, потому что вы храните производную информацию (есть исключения по причинам производительности).Таким образом, лучшее решение - создать представление, предложенное AndreKR.Это обеспечивает всегда правильное итоговое значение, которое так же легко ВЫБРАТЬ из базы данных, как если бы оно было в фактическом сохраненном столбце.

0 голосов
/ 25 ноября 2010

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

Create Table MyTable
 (
     colA Integer,
     colB Integer,
     colC Intgeer,
     SumABC As colA + colB + colC
 )

В общем случае просто введите нужное имя столбца, слово «как» и формулу или уравнение, чтобы получить значение. Этот подход не использует дополнительного хранилища, он вычисляет значение каждый раз, когда кто-то выполняет его, поэтому профиль таблицы остается более узким, и вы получаете лучшую производительность. Единственный недостаток - вы не можете поместить индекс в вычисляемый столбец. (хотя в SQL-сервере есть флаг, позволяющий указать базе данных, что она должна сохранять значение при каждом его создании или обновлении ... В этом случае его можно проиндексировать)

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

0 голосов
/ 25 ноября 2010

Вы можете использовать триггер для обновления столбца времени при каждом изменении таблицы инструкций, но более «нормальным» (менее избыточным) способом будет вычисление столбца времени с помощью предложения group by при объединении инструкций иТаблица получения [sic].

...