sqlstate sqlcode error codes sql db2

sqlcode - sqlstate db2 codes



"AMOUNT1" no es vĂ¡lido en el contexto donde se usa (3)

Este tema fue respondido desde entonces, y mi primer ejemplo es un duplicado [pero con un formato diferente]; puede haber algo de valor / agregar en lo que ofrezco.

El nombre asignado a una expresión en la lista de columnas SELECT no está disponible para referencia dentro del alcance de cualquier otra cláusula de la misma consulta SELECT; por ejemplo, el nombre asignado allí, está disponible para referencia en una cláusula ORDER BY, pero no puede ser referencia en una cláusula WHERE o cláusula HAVING, por lo tanto, explica el error visto.

Para evitar repetir la expresión en la cláusula HAVING [señalando: el agregado no está permitido en una cláusula WHERE a menos que se reescriba como una subselección escalar], considere asignar un nombre al resultado de la expresión dentro de una expresión de tabla derivada ; que habilita el alcance del nombre en la consulta de esa tabla derivada. Al eliminar la referencia a una expresión duplicada , eso también evita tener que mantener las dos copias de manera idéntica, si es necesario realizar alguna revisión a la consulta.

El identificador de tabla y el uso del nombre de columna calificado que se muestra aquí son ambos opcionales, pero se incluyen para aclarar de dónde proviene el nombre referenciado; los ejemplos muestran dos formas de codificar una tabla derivada para hacer referencia a la expresión nombrada.

select S.AMOUNT1 from table /* Nested Table Expression (NTE) */ ( select SUM ( orders.totalproduct + orders.TOTALTAX + orders.totalshipping - orders.totaladjustment ) as amount1 from orders ) as S where S.amount1>10000 with /* Common Table Expression (CTE) */ aggSum ( AMOUNT1 ) as ( select SUM ( orders.totalproduct + orders.TOTALTAX + orders.totalshipping - orders.totaladjustment ) as amount1 /* named here; or, as shown, named above */ from orders ) select C.AMOUNT1 from aggSum as C /* from the above (CTE) */ where C.amount1>10000

Aunque también existe la siguiente opción [una que dudo que alguna vez codifique, porque], encuentro esto mucho más difícil de leer que haber hecho referencias duplicadas a la expresión en la cláusula HAVING [es decir, como se muestra en el segundo ejemplo en la respuesta aceptada]. Esta consulta encapsula la misma consulta agregada en una subconsulta ya que a continuación se hace referencia a ella como una subselección escalar en la cláusula WHERE:

select SUM ( orders.totalproduct + orders.TOTALTAX + orders.totalshipping - orders.totaladjustment ) as amount1 from orders where ( select SUM ( orders.totalproduct + orders.TOTALTAX + orders.totalshipping - orders.totaladjustment ) from orders ) > 10000

Estoy ejecutando la siguiente consulta en DB2:

select SUM (orders.totalproduct +orders.TOTALTAX +orders.totalshipping -orders.totaladjustment) as amount1 from orders where amount1>10000

La consulta no se ejecuta, obtengo esta excepción en su lugar:

"AMOUNT1" no es válido en el contexto donde se usa .. SQLCODE = -206, SQLSTATE = 42703, DRIVER = 3.64.96 Código SQL: -206, SQL Estado: 42703

¿Qué estoy haciendo mal?


No puede crear y usar amount1 al mismo tiempo en DB2.

Prueba esto:

select * from ( select SUM (orders.totalproduct+orders.TOTALTAX+orders.totalshipping- orders.totaladjustment) as amount1 from orders ) tmp where amount1>10000

o esto:

select SUM (orders.totalproduct+orders.TOTALTAX+orders.totalshipping- orders.totaladjustment) as amount1 from orders having SUM (orders.totalproduct+orders.TOTALTAX+orders.totalshipping-orders.totaladjustment)>10000


en db2, no puede usar un alias que haya creado para sus columnas en la misma sub consulta para el where / having.

Incluso en MySQL / BigQuery, creo que solo puede hacer referencia a cualquier alias en el grupo por / orden por / teniendo declaraciones, no el dónde.

Utilice una consulta secundaria y filtre allí, o copie el código de la columna (SIN el alias) y péguelo en where. Pero recomendaría la opción de sub consulta.