Pregunta

Digamos que tengo una declaración selecta que dice...

select * from animals

Eso da un resultado de consulta de todas las columnas de la tabla.

Ahora, si la columna 42 de la tabla animals es is_parent, y quiero devolver eso en mis resultados, justo después gender, así puedo verlo más fácilmente.Pero también quiero todas las demás columnas.

select is_parent, * from animals

esto regresa ORA-00936: missing expression.

La misma declaración funcionará bien en Sybase y sé que necesita agregar un alias de tabla al animals mesa para que funcione ( select is_parent, a.* from animals ani), pero por qué ¿Oracle debe necesitar un alias de tabla para poder realizar la selección?

¿Fue útil?

Solución

En realidad, es fácil resolver el problema original.Sólo debes calificar el *.

select is_parent, animals.* from animals;

debería funcionar bien.Los alias para los nombres de las tablas también funcionan.

Otros consejos

No hay ningún mérito en hacer esto en el código de producción. Hay que indicar el nombre de las columnas que queremos en lugar de utilizar el SELECT * constructo.

En cuanto a la consulta ad-hoc, se consigue un IDE - SQL Developer, SAPO, PL / SQL Developer, etc - que nos permite manipular peticiones y conjuntos de resultados sin necesidad de extensiones a SQL.

Buena pregunta, he preguntado a menudo esto mismo, pero luego lo han aceptado como una de esas cosas ...

problema similar es la siguiente:

sql>select geometrie.SDO_GTYPE from ngg_basiscomponent

ORA-00904: "GEOMETRIE"."SDO_GTYPE": invalid identifier

donde geometrie es una columna de tipo mdsys.sdo_geometry.

Añadir un alias y la cosa funciona.

sql>select a.geometrie.SDO_GTYPE from ngg_basiscomponent a;

Un montón de buenas respuestas hasta el momento sobre por qué select * no debe utilizarse y todos ellos están perfectamente correcta. Sin embargo, no creo que ninguno de ellos responde a la pregunta original sobre por qué falla la sintaxis particular.

Por desgracia, creo que la razón es ... "ya que no lo hace".

No creo que sea nada que ver con una sola mesa frente a consultas de mesas múltiples:

Esta bien funciona:

select *
from
    person p inner join user u on u.person_id = p.person_id

Pero esto no funciona:

select p.person_id, *
from
    person p inner join user u on u.person_id = p.person_id

Aunque esto funciona:

select p.person_id, p.*, u.*
from
    person p inner join user u on u.person_id = p.person_id

Podría ser algo histórico compatibilidad con el código heredado de 20 años de edad.

Otra para el "comprar por qué !!!" cubo, junto con qué no puede usted por un grupo de alias ?

El caso de uso para el alias. * Formato es el siguiente

select parent.*, child.col
from parent join child on parent.parent_id = child.parent_id

Es decir, seleccionar todas las columnas de una tabla en una unión, más (opcionalmente) una o más columnas de otras tablas.

El hecho de que se puede usar para seleccionar la misma columna dos veces es sólo un efecto secundario. No tiene ningún sentido real a la selección de la misma columna dos veces y no creo que la pereza es una justificación real.

Select * en el mundo real sólo es peligroso cuando se hace referencia a las columnas por el número de índice después de la recuperación en lugar de por su nombre, el mayor problema es la ineficiencia cuando se requieren no todas las columnas del conjunto de resultados (el tráfico de red, carga de CPU y memoria). Por supuesto, si va a añadir columnas de otras tablas (como es el caso de este ejemplo puede ser peligroso ya que estas tablas pueden con el tiempo tener columnas con nombres que coinciden, select *, x en ese caso sería un error si se agrega una columna a la tabla x que antes no lo tienen.

  

¿Por qué debe Oracle necesita un alias de tabla para poder trabajar fuera del selecto

Teradata está requiriendo el mismo. Ya que ambos son bastante antiguo (quizás mejor llamarlo madurar :-) DBMSes esto puede haber razones históricas.

Mi explicación habitual es:. * un medio sin reservas todo / todas las columnas y el analizador / optimizador es confuso, simplemente porque usted solicita más que todo

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top