2011-03-03 29 views
14

digamos que tengo una gran selección en una determinada tabla. Un valor para una columna se calcula con logc complejo y se llama Columna A. Ahora, para otra columna, necesito el valor de ColumnA y le agrego otro valor estático.¿Utiliza el valor de una columna para otra columna (SQL Server)?

SQL muestra:

select table.id, table.number, complex stuff [ColumnA], [ColumnA] + 10 .. from table ... 

El [ColumnA] + 10 es lo que estoy buscando. Lo complejo es una gran caja/cuando bloque.

Ideas?

Respuesta

16

Si desea hacer referencia a un valor que se calcula en la cláusula SELECT, tiene que mover la consulta existente en un sub-SELECT:

SELECT 
    /* Other columns */, 
    ColumnA, 
    ColumnA + 10 as ColumnB 
FROM 
(select table.id, table.number, complex stuff [ColumnA].. from table ... 
) t 

Usted tiene que introducir un alias para esta tabla (en lo anterior, t, después del corchete de cierre), incluso si no va a usarlo.

(Equivalente - asumiendo que usted está utilizando SQL Server 2005 o posterior - usted puede mover su consulta existente en un CTE):

;WITH PartialResults as (
    select table.id, table.number, complex stuff [ColumnA].. from table ... 
) 
SELECT /* other columns */, ColumnA, ColumnA+10 as ColumnB from PartialResults 

CTE tienden a mirar más limpia si usted tiene múltiples niveles de parcial cómputos que se realizan, es decir si ahora tiene un cálculo que depende de ColumnB para incluirlo en su consulta.

1

Puede resolver esto con una subconsulta y alias de columna.

He aquí un ejemplo:

SELECT MaxId + 10 
FROM (SELECT Max(t.Id) As MaxId 
     FROM SomeTable t) As SomeTableMaxId 
1

Usted podría:

  1. ¿Tienen el + 10 en el código de cliente
  2. Escribir una función escalar de valor para encapsular la lógica de complex stuff. Se optimizará en una sola llamada.
  3. Copia complex stuff lógica para la otra columna. Debería optimizarse en 1 llamada.
  4. uso de un sub-select para aplicar el cálculo adicional
+0

1 me gusta que la segunda idea –

Cuestiones relacionadas