2011-07-28 30 views
14

No estoy seguro de cuál es la mejor manera de hacerlo, así que describiré cuál es el objetivo final, y si una columna calculada es la respuesta, por favor ayúdenme ve esa ruta, o tal vez una mejor ruta.Selección de columna calculada por SQL Server de otra tabla

Tengo dos tablas:

órdenes

OrderId 
PackageId 
MediaSpend 
TotalAdViews (Computed column) 

Paquetes

PackageId 
BaseAdViews 

Cada orden se asigna un paquete que viene con decir 1.000 puntos de vista, a continuación, puede comprar más medios gastan para obtener más puntos de vista. Quería crear una columna llamada TotalAdViews que agregaría BaseAdViews + MediaSpend. Según entiendo, si la persistencia está habilitada, la columna no necesitará volver a calcular cada vez que se consulte, lo que podría ayudar a mejorar el rendimiento.

¿Cómo obtengo un valor de otra tabla en mi columna calculada? O sugiera una forma alternativa de lograr mi objetivo.

Respuesta

13

No podrá usar columnas de otra tabla dentro de una expresión de columna calculada. Este es un extracto del MSDN documentation.

Una columna calculada se calcula a partir de una expresión que puede usar otras columnas en la misma tabla.

Usted mencionó que su motivación para el uso de una columna calculada era aumentar el rendimiento. Hay un montón de restrictions, pero un indexed view puede agregar valor aquí.

+0

Huy, se perdió esa parte. –

47

sé esta respuesta se produce dos años de retraso, pero sólo para ayudar a cualquier persona que googles y encuentra a este post:

Es perfectamente legal para definir una función definida por el usuario y utilizarlo como el valor calculado. Esta función puede contener sentencias select de otras tablas.

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 

Luego, en su columna calculada, sólo tiene que utilizar la expresión dbo.getSumAdViews(PackageId)

+0

¿Cómo se compara este enfoque con join directamente en términos de rendimiento? – liang

+2

Es cierto, solo tenga en cuenta que esto no funcionaría en caso de que desee que la columna calculada se mantenga. –

+0

@liang: Según [sqlcat] (https://blogs.msdn.microsoft.com/sqlcat/2011/11/28/a-computed-column-defined-with-a-user-defined-function-might- impact-query-performance /), SQL se niega a paralelizar las consultas que utilizan una columna UDF calculada. Según [Erik Darling] (https://www.brentozar.com/archive/2016/01/another-reason-why-scalar-functions-in-computed-columns-is-a-bad-idea/), eso también significa que las secuencias de comandos 'DBCC CHECKDBB' se negarán a paralelizar (lo cual es discutible si no está en Enterprise Edition). – Brian

0

si es sólo con fines de exhibición, por qué no crear una vista ..

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