2010-02-23 9 views
20

decir que tengo una instrucción de selección que va ..¿Por qué seleccionar las columnas especificadas, y todas, incorrectas en Oracle SQL?

select * from animals 

que da un resultado de una consulta de todas las columnas de la tabla.

Ahora, si la columna 42 de la tabla animals es is_parent, y quiero volver que en mis resultados, justo después de gender, por lo que se puede ver con mayor facilidad. Pero también quiero todas las otras columnas.

select is_parent, * from animals 

Esto devuelve ORA-00936: missing expression.

La misma afirmación no tendrán ningún problema en Sybase, y sé que es necesario agregar un alias de tabla para la tabla animals a conseguir que funcione (select is_parent, a.* from animals ani), pero qué debe Oracle necesita un alias de tabla para poder para resolver el seleccionar?

+0

Gracias por hacer esta pregunta. Estoy en transición de SQL Server a Oracle. Estoy viendo el mismo error. – user3454439

Respuesta

17

En realidad, es fácil de resolver el problema original. Solo tienes que calificar el *.

select is_parent, animals.* from animals; 

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

+0

Nunca pondría "*" en el código de producción, pero este es el trabajo que necesitaba. Estaba haciendo algo de "caza" y estaba intentando algo como Select (ColA || ',' || ColB) como "CompoundPK", * de MYTABLE. Gracias por la solución alias. Upvote. – granadaCoder

1

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, la selección de todas las columnas de una tabla en una combinación, además (opcionalmente) una o más columnas de otras tablas.

El hecho de que pueda usarlo para seleccionar la misma columna dos veces es solo un efecto secundario. No hay ningún punto real para seleccionar la misma columna dos veces y no creo que la pereza sea una justificación real.

+1

Sé que si usa varias tablas necesita definir para cuáles devolver todas las columnas, pero me preguntaba por qué Oracle no puede resolver qué tabla quiero decir cuando puede elegir una tabla. Además, encuentro una 'columna de selección, *' que se usa cuando la depuración ahorra tiempo en comparación con intentar copiar las columnas y trasladarlas a Excel, moviendo las columnas manualmente con el riesgo de que no coincidan las columnas de datos. – glasnt

2

No tiene sentido hacer esto en el código de producción. Deberíamos nombrar explícitamente las columnas que queremos en lugar de usar el constructo SELECT *.

En cuanto a las consultas ad hoc, consígase un IDE - Desarrollador SQL, TOAD, Desarrollador PL/SQL, etc. - que nos permite manipular consultas y conjuntos de resultados sin necesidad de extensiones a SQL.

+2

'Seleccionar *' en el mundo real es realmente peligroso. Me he visto atrapado antes cuando se agregan columnas y '*' se usa en los procedimientos. Sin embargo, para consultas adhoc, mi declaración fue completamente válida. – glasnt

1

El número más grande es ineficaz cuando no se requieren todas las columnas en el conjunto de resultados (tráfico de red, CPU y carga de memoria). Por supuesto, si agrega columnas de otras tablas (como es el caso en este ejemplo, puede ser peligroso, ya que estas tablas pueden tener columnas con nombres coincidentes, select *, x en ese caso fallaría si se agrega una columna x al tabla que anteriormente no la tenía.

2

Muchas buenas respuestas hasta el momento sobre por qué select * no deberían usarse y están perfectamente correctas. Sin embargo, no creo que ninguna de ellas responda la pregunta original sobre por qué la sintaxis particular, falla.

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

no creo que sea nada que ver con un solo ta ble vs.consultas multi-mesa:

Esto funciona bien:

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 Código heredado de 20 años.

Otro para "comprar por qué" cubo, junto con why can't you group by an alias?

+1

Lo negativo es un poco duro. Creo que solo Rene y yo hasta la fecha hemos respondido la pregunta. Todas las otras respuestas solo dicen que "select *" no debe usarse. –

2

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.

Agregue un alias y la cosa funciona.

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

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

Teradata está requiriendo la misma. Como ambos son bastante viejos (quizás mejor llámalo maduro :-) DBMSes esto podría ser razones históricas.

Mi explicación habitual es: un rotundo * significa todo/todas las columnas y el analizador/optimizador es simplemente confundido porque usted solicita más que todo.

Cuestiones relacionadas