Вычисляемое выражение столбца в 2 таблицах - PullRequest
1 голос
/ 26 февраля 2012

У меня есть таблица продуктов и таблица сведений

Продукт

ID int
Price int

Деталь

ID int
Quantity int
Total int

Я делаю умножение Quantity * Price, какую команду SQL использовать?Спасибо

Я ИСПОЛЬЗУЮ ЭТО

ALTER TABLE DETAIL
ADD Total AS Quantity * product.price where Detail.ID = Product.ID

Ответы [ 4 ]

2 голосов
/ 26 февраля 2012

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

Если вы используете SQL Server, ответ прост: вы не можете сделать это.

Вычисляемый столбец не может ссылаться на другую таблицу - только константы, столбцы из той же таблицы - или хранимые функции.

Теперь вы можете создать хранимую функцию, которая будет извлекать эти данные из другой таблицы - я бы НЕ сделал это. Использование доступа к данным в хранимых функциях - верный рецепт снижения производительности - просто не делайте этого!

Решением здесь, вероятно, будет представление по двум таблицам, которое будет выполнять вычисления

CREATE VIEW dbo.ProductAndDetail 
AS
   SELECT
       p.ID, p.Price,
       d.Quantity,  
       Total = ISNULL(d.Quantity, 0) * ISNULL(p.Price, 0.0)
   FROM
       dbo.Product p
   INNER JOIN
       dbo.Detail d ON p.ID = d.ID

Затем вы можете выбрать из этого нового вида:

SELECT ID, Price, Quantity, Total
FROM dbo.ProductAndDetail

и Total рассчитывается «на лету» для каждой строки

Обновление: ах - ладно, похоже, вам нужен статический набор данных для отчетов - в этом случае вы можете сделать следующее:

   SELECT
       p.ID, p.Price,
       d.Quantity,  
       Total = ISNULL(d.Quantity, 0) * ISNULL(p.Price, 0.0)
   INTO
       dbo.ProductAndDetailsForReporting
   FROM
       dbo.Product p
   INNER JOIN
       dbo.Detail d ON p.ID = d.ID

Затем вы получите новую таблицу dbo.ProductAndDetailsForReporting, которая содержит все строки из Product и Detail и вычисленный столбец Total. Теперь запустите ваши отчеты для этой таблицы - она ​​ не изменит , если вы не измените что-то самостоятельно (в отличие от представления, которое всегда обновляется).

0 голосов
/ 26 февраля 2012

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

SELECT (Product.Price * Detail.Quantity) AS 'answer'
FROM Product
INNER JOIN Detail ON Product.ID = Detail.ID
WHERE Product.Price IS NOT NULL AND Detail.Quantity IS NOT NULL AND Product.Price != '' AND Detail.Quantity != ''

OR * .. * 1004

SELECT (Product.Price * Detail.Quantity) AS 'answer'
FROM Product
LEFT OUTER JOIN Detail ON Product.ID = Detail.ID
WHERE Product.Price IS NOT NULL AND Product.Price != ''
0 голосов
/ 26 февраля 2012

Вы можете создать вычисляемый столбец в таблице только на основе других столбцов в той же таблице.Если вы хотите достичь этого, вам нужно создать триггер, который обновляет это значение в физическом столбце (посредством чего триггер может выполнить соединение).(Или вы можете создать вид).

0 голосов
/ 26 февраля 2012

ваш код должен быть примерно как

employe.Quantity * product.price where empoye.ID=product.ID

, это идея, которая должна вам помочь.

...