Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Oracle »

Error de identificador no válido

Estas en el tema de Error de identificador no válido en el foro de Oracle en Foros del Web. No se por que no funciona esto ni como arreglarlo. A ver si me pueden ayudar. Código: select t1.*, t2.* from personal t1 left join ...
  #1 (permalink)  
Antiguo 03/02/2011, 04:12
Sladino
Invitado
 
Mensajes: n/a
Puntos:
Error de identificador no válido

No se por que no funciona esto ni como arreglarlo. A ver si me pueden ayudar.

Código:
select t1.*, t2.* from personal t1 left join
(select * from puesto where personal_id = t1.id) t2 on t1.id = t2.personal_id;
ORA-00904: "T1"."ID": identificador no válido

El problema esta en t1.id de la subconsulta.

Un saludo
  #2 (permalink)  
Antiguo 03/02/2011, 10:34
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Error de identificador no válido

Intenta con esto

Código SQL:
Ver original
  1. SELECT t1.*, t2.* FROM personal t1
  2. LEFT JOIN puesto t2 ON t1.id = t2.personal_id;

Saludos
Leo.
  #3 (permalink)  
Antiguo 03/02/2011, 14:26
Sladino
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Error de identificador no válido

Muchas gracias por responder Leo, el problema es que la consulta es algo más larga de la que he puesto pero el error es el mismo. No sabia si estaba haciendo algo mal.

Pongo la sql algo mas completa a ver si me pueden ayudar.

Código:
SELECT * FROM personal t1 LEFT JOIN 
(SELECT * FROM(SELECT * FROM puesto WHERE personal_id = t1.id
 ORDER BY sueldo DESC) WHERE ROWNUM <2) t2 on  t1.id = t2.personal_id
Vamos que la idea es que un empleado puede tener varios puestos y solo quiero mostrar aquel por el que mas cobre

Por eso no creo que tu solución me sirva.

Muchas gracias. Yo sigo peleándome con ella.

Un saludo
  #4 (permalink)  
Antiguo 04/02/2011, 14:55
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Error de identificador no válido

Cita:
Iniciado por Sladino Ver Mensaje
el problema es que la consulta es algo más larga de la que he puesto pero el error es el mismo. No sabia si estaba haciendo algo mal.
Hola de nuevo Sladino:

El problema es que lo que quieres hacer no tiene nada que ver con lo que preguntaste en un principio jejeje... pero en fin. Estás equivocando el camino al tratar de utilizar rownum para filtrar tu consulta. Lo que necesitas hacer es numerar tus registros PARA CADA UNO DE TUS EMPLEADOS, ROWNUM sirve para numerar el total de los registros. Para poder numerar los registros agrupando por empleado debes utilizar la función ROW_NUMBER, te dejo alguna lectura didáctica para que aprendas más acerca del concepto.

Sintaxis ROW_NUMBER

Para ver la diferencia entre rownum y row_number

Vamos a ver si esto es lo que necesitas:

Supongo que tu tabla Personal tiene más o menos los siguientes datos:

Código:
id|nombre
--------------------
1|uno
2|dos
y tu tabla Puesto tiene más o menos los siguientes datos

Código:
id|personal_id|salario
------------------------------
1|1|500
2|1|200
3|1|300
4|1|100
5|2|600
7|2|100
6|2|500
esto quiere decir que el empleado UNO tiene o ha tenido cuatro empleos y el empleado DOS tres. Para mostrar LOS DOS EMPLEOS MEJOR REMUNERADOS DE CADA UNO DE ELLOS tendrías que hacer algo más o menos como esto:

Código SQL:
Ver original
  1. SELECT nombre, salario FROM
  2. (
  3. SELECT T1.nombre, T2.Salario,
  4. ROW_NUMBER() OVER (PARTITION BY T2.personal_id ORDER BY T2.salario DESC) AS posicion
  5. FROM personal T1 INNER JOIN puesto T2 ON T1.id = T2.personal_id
  6. ) T3 WHERE posicion <= 2

Lo que hace esta consulta es "Rankear" los puestos para cada persona de acuerdo a su salario, de tal manera que la consulta interna quedaría más o menos así:

Código:
nombre|salario|posicion
--------------------------------
uno|500|1
uno|300|2
uno|200|3
uno|100|4
dos|600|1
dos|500|2
dos|100|3
si observas la función ROW_NUMBER en su parámetro OVER tiene definido PARTITION BY T2.personal_id lo que le indica que tiene que diferenciar entre cada empleado; la parte de ORDER BY T2.salario indica que es justamente el campo SALARIO el que va a determinar la posición o Rank del registro.

Finalmente lo que haces es filtrar tu información para traer sólo los dos primeros registros. El resultado final de la consulta quedaría entonces así:

Código:
nombre|salario
-----------------------
uno|500
uno|300
dos|600
dos|500
Es decir, los dos puestos mejor pagados para cada uno de los empleados. Dale un vistazo a las ligas que te puse, checa el ejemplo y si continuas con problemas lo comentas en el foro para tratar de ayudarte.

Saludos
Leo.

-------------------------
Si quieres resultados distintos, no hagas siempre lo mismo
Albert Einstein

Etiquetas: identificador
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:01.