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

order by rowid

Estas en el tema de order by rowid en el foro de Oracle en Foros del Web. Hola, me han pedido que recoja unos campos de una tabla de tal forma que "si para una poliza hubiera mas de tres registros nos ...
  #1 (permalink)  
Antiguo 19/05/2014, 12:29
 
Fecha de Ingreso: mayo-2014
Mensajes: 6
Antigüedad: 9 años, 10 meses
Puntos: 0
Pregunta order by rowid

Hola, me han pedido que recoja unos campos de una tabla de tal forma que "si para una poliza hubiera mas de tres registros nos tenemos que quedar con los tres primeros ordenado por rowid"

No se me ocurre cómo hacerlo, estoy pensando en tablas intermedias, pero no sé cómo recoger los datos...

¿me puede ayudar alguien por favor?

Gracias, un saludo,

marisa
  #2 (permalink)  
Antiguo 19/05/2014, 12:41
 
Fecha de Ingreso: junio-2007
Mensajes: 891
Antigüedad: 16 años, 10 meses
Puntos: 43
Respuesta: order by rowid

Creo que no tiene mucho sentido hacer un ORDER BY ROWID. El rowid es una pseudo columna que índice donde se encuentra exactamente y físicamente ese registro.

Mira a ver si te vale esto.

Código SQL:
Ver original
  1. SELECT * FROM
  2. (
  3. SELECT ROWNUM AS ORDEN, ROWID, CAMPO1, CAMPO2.....
  4. FROM TABLA
  5. ORDER BY ROWID
  6. ) WHERE ORDEN < 4
  #3 (permalink)  
Antiguo 19/05/2014, 13:00
 
Fecha de Ingreso: mayo-2014
Mensajes: 6
Antigüedad: 9 años, 10 meses
Puntos: 0
Respuesta: order by rowid

Pues por todo lo que he estado leyendo en foros y artículos he pensado lo mismo que tú (desde mi desconocimiento), que no tenía mucho sentido hacer eso, pero así lo ha pedido el cliente, no sé muy bien en base a qué criterio...

Voy a probar esto que me dices, te lo agradezco muchísimo! Un saludo,

Marisa
  #4 (permalink)  
Antiguo 19/05/2014, 13:39
 
Fecha de Ingreso: mayo-2014
Mensajes: 6
Antigüedad: 9 años, 10 meses
Puntos: 0
Desacuerdo Respuesta: order by rowid

Buenas, no ha funcionado.

Estoy utilizando una ETL y me veo obligada a crear una tabla intermedia con la subquery. El caso es que el ORDEN no se resetea, y va creciendo, y creciendo hasta el infinito... ¿alguna sugenrencia?

Muchas gracias por adelantado

Marisa
  #5 (permalink)  
Antiguo 19/05/2014, 13:53
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: order by rowid

Yo empezaría por preguntar quién esta definiendo el tema de "si para una poliza hubiera mas de tres registros nos tenemos que quedar con los tres primeros ordenado por rowid".
¿Quién lo pide, y qué es lo que esa persona supone que implica?
¿Se refiere a los tres más recientes ingresos de la tabla?

Si es "los tres más recientes", eso no necesariamente se cumple con el ROWID, hasta lo que sé. No es exactamente lo mismo.

Recordemos lo que dice el manual:
Cita:
Para cada fila de la base de datos, la pseudocolumna ROWID devuelve la dirección de la fila. En bases de datos Oracle, el valor ROWID contiene la información necesaria para localizar una fila:

- El número de objeto de datos del objeto
- El bloque de datos en el archivo de datos en la que reside la fila
- La posición de la fila en el bloque de datos (primera fila es 0)
- El archivo de datos en la que reside la fila (primer archivo es 1). El número de archivo es relativo al tablespace.

Por lo general, un valor rowid identifica de forma exclusiva una fila en la base de datos. Sin embargo, las filas de diferentes tablas que se almacenan juntos en el mismo grupo pueden tener el mismo rowid.
Así que la pregunta es válida: ¿Qué se quiere obtener en realidad.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 19/05/2014 a las 13:58
  #6 (permalink)  
Antiguo 19/05/2014, 14:01
 
Fecha de Ingreso: mayo-2014
Mensajes: 6
Antigüedad: 9 años, 10 meses
Puntos: 0
Respuesta: order by rowid

Pues el que lo pide es el cliente, y supongo que lo ha elegido como criterio de ordenación arbitrario...

En el caso de que se quisiera eso, ¿cómo lo harías?

Gracias, un saludo,

marisa
  #7 (permalink)  
Antiguo 19/05/2014, 14:27
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: order by rowid

El cliente no puede haber pedido eso, a menos que tenga cierto nivel de conocimientos en fundamentos de Oracle y sus tipos de dato. Ese nivel de conocimientos debería ser suficiente para que entienda que un ROWID es un valor alfanumérico, y a pesar de su unicidad, no es un valor funcional para ordenamientos.
Lo que debe definir (si es realmente él quien lo pide), es qué ordenamiento realmente necesita y sobre la base de qué. SI el ordenamiento es en función del momento de inserción, eso se debería controlar ya sea por sequence, o bien por una columna DATE. No tiene mucho sentido usar los ROWID, desde el momento en que quedan afectados por cualquier DELETE / INSERT que se ejecute en la tabla a consultar.
Que explique claramente qué orden basado en los datos de la tabla quiere. Lo que piide no tiene sentido para ser una query sobre datos del mundo real.
Si el cliente no tiene correctos y buenos conocimientos de Oracle, entonces debería dejarte la elección del tipo de datos a ti.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #8 (permalink)  
Antiguo 19/05/2014, 15:07
 
Fecha de Ingreso: mayo-2014
Mensajes: 6
Antigüedad: 9 años, 10 meses
Puntos: 0
Respuesta: order by rowid

Te agradezco la respuesta. Se lo he planteado y a ver qué respuesta me da. Yo no tengo mucha idea, y aunque llevo toda la tarde informándome en foros, y viendo que lo que pide no es "práctico", pues es que es lo que me han pedido.

Mañana os cuento a ver qué es lo que me responde. Gracias!

Marisa
  #9 (permalink)  
Antiguo 20/05/2014, 04:53
 
Fecha de Ingreso: mayo-2014
Mensajes: 6
Antigüedad: 9 años, 10 meses
Puntos: 0
Respuesta: order by rowid

Bueno, pues definitivamente el cliente lo quiere así, ya lo he conseguido del modo que me indicó más o menos el primer "ayudante".

Mi pregunta:
El criterio de ordenación por ROWID ¿es por algún motivo específico? Ya que ésta ordenación no nos dará ni los primeros modificados, ni los más recientes, ¿se podría establecer un criterio alternativo?
Su respuesta:
Ese es el problema.
Aparentemente no hay nada que nos pueda ayudar a la ordenación.


Gracias de todas formas!! Muy amables!
  #10 (permalink)  
Antiguo 20/05/2014, 06:35
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: order by rowid

¿No tiene ningún campo donde se use un sequence? ¿Ningun campo de fecha? ¿Nada?

Ahora bien, ¿Está consciente que cualquier DELETE/UPDATE y/o INSERT luego de un DELETE, habrá que el ordenamiento obtenido sea incorrecto, o falso?
Hay que tomar en consideración que si se borra un registro cualquiera, y luego se inserta otro, el nuevo usará el ROWID disponible desde el DELETE anterior, por lo que luego ese nuevo registro bien puede ser en realidad el último obtenido del ORDER BY ROWID, es decir, no saldrá entre los tres primeros porque su ROWID no está entre ellos, a pesar de ser el INSERT más reciente.
¿Se entiende la idea?
Eso es lo que dice expresamente el manual de Oracle:
Cita:
You should not use ROWID as the primary key of a table. If you delete and reinsert a row with the Import and Export utilities, for example, then its rowid may change. If you delete a row, then Oracle may reassign its rowid to a new row inserted later.
Sería mucho más práctico, a mi entender, crear una columna que permita ordenamiento cronológico, aunque eso implique procesar toda la tabla de nuevo.
¿Esa tabla está relacionada con alguna otra que se pueda usar de soporte para obtener el orden de entrada?
¿Podrías mostrarnos la estructura (CREATE TABLE) de la tabla en cuestión?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 20/05/2014 a las 07:04
  #11 (permalink)  
Antiguo 23/05/2014, 08:44
 
Fecha de Ingreso: abril-2012
Ubicación: Capital Federal
Mensajes: 283
Antigüedad: 12 años
Puntos: 15
Respuesta: order by rowid

Como andan, una solución efectiva y práctica es agregar una columna a la query final definida como ROWNUM y ordenar por este campo.

Si necesitan la query se las paso.

Saludos

damimg
Database Specialist - MVP

Etiquetas: order, registro, tabla
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 13:47.