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)