Вычисленный столбец SQL Server выбирается из другой таблицы

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

У меня есть две таблицы:

Заказы

OrderId
PackageId
MediaSpend
TotalAdViews (Computed column)

Пакеты

PackageId
BaseAdViews

Каждому заказу присваивается пакет, включающий 1000 просмотров, тогда вы можете купить больше средств для получения большего количества просмотров. Я хотел создать столбец с именем TotalAdViews, который добавит BaseAdViews + MediaSpend. Исходя из моего понимания, если стойкость разрешена, столбцу не нужно пересчитывать каждый раз, когда он запрашивается, что может помочь в производительности.

Как мне получить значение из другой таблицы в моем вычисляемом столбце? Или попросите альтернативный способ выполнить мою цель.

Ответы

Ответ 1

Вы не сможете использовать столбцы из другой таблицы в выражении вычисленного столбца. Это выдержка из документации MSDN.

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

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

Ответ 2

Я знаю, что этот ответ приходит на два года позже, но только для того, чтобы помочь любому, кто отправляется в Google и находит этот пост:

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

CREATE FUNCTION dbo.getSumAdViews(@packageId int)
RETURNS int
AS
BEGIN
    DECLARE @r int
    select @r = SUM(BaseAdViews) from Packages where PackageId = @packageId
    RETURN @r
END

Затем в вычисленном столбце просто используйте выражение dbo.getSumAdViews(PackageId)

Ответ 3

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

select <<add other columns you need>> mediaspend+basicadviews as totaladviews
from 
orders o
join
packages p
on p.packageid=o.orderid