ventaja una sumar que propone especificacion condicional columnas columna campos calculados calculadas calculada añadir sql sql-server-2008 calculated-columns

sql - una - fórmula para la columna calculada basada en la columna de la tabla diferente



sql server select columna calculada (2)

Esto parece ser más un trabajo para vistas (vistas indexadas, si necesita búsquedas rápidas en la columna calculada):

CREATE VIEW AnyView WITH SCHEMABINDING AS SELECT a.rec_id, a.s_id, a.n_code, a.rec_id * c.nvalue AS foo FROM AnyTable a INNER JOIN C_Const c ON c.code = a.n_code

Esto tiene una diferencia sutil con respecto a la versión de la subconsulta, ya que devolvería múltiples registros en lugar de producir un error si hay resultados múltiples para la combinación. Pero eso se resuelve fácilmente con una restricción UNIQUE en c_const.code (sospecho que ya es una PRIMARY KEY ).

También es mucho más fácil de entender para alguien que la versión subconsulta.

Puede hacerlo con una subconsulta y UDF como lo ha demostrado marc_s, pero es probable que sea muy ineficiente en comparación con un simple JOIN , ya que un UDF escalar tendrá que calcularse fila por fila.

Considere esta tabla: c_const

code | nvalue -------------- 1 | 10000 2 | 20000

y otra mesa t_anytable

rec_id | s_id | n_code --------------------- 2 | x | 1

El objetivo es que s_id sea ​​una columna calculada, basada en esta fórmula:

rec_id*(select nvalue from c_const where code=ncode)

Esto produce un error:

Las subconsultas no están permitidas en este contexto. Solo se permiten expresiones escalares.

¿Cómo puedo calcular el valor de esta columna calculada usando la columna de otra tabla como entrada?


Puede crear una función definida por el usuario para esto:

CREATE FUNCTION dbo.GetValue(INT @ncode, INT @recid) RETURNS INT AS SELECT @recid * nvalue FROM c_const WHERE code = @ncode

y luego usa eso para definir tu columna calculada:

ALTER TABLE dbo.YourTable ADD NewColumnName AS dbo.GetValue(ncodeValue, recIdValue)