2011-05-03 46 views
6

quiero bloquear un grupo de registros utilizando la siguiente consulta:cómo resolver ORA-02014: no se puede seleccionar Actualizar De vista con DISTINCT, GROUP BY

select * 
    from (select * 
      from event_table 
     where status = 'S' 
     order by creation_data asc 
     ) 
where rownum <=10 
for update; 

event_table no es una opinión. Es una tabla normal:

create table event_table 
(
id   number, 
creation_date date, 
status  number, 
info   clob 
); 

La clave primaria es la identificación del campo.

¿Puedo usar rownum con select for update en absoluto?

¿Hay alguna otra solución al usar select for update pero también seleccionar solo un grupo de filas y no todos los resultados de la selección?

Por ejemplo, tengo una tarea que ejecuta cada X interna y necesita usar select for update para esa tabla, pero si la selección devuelve 500 filas, solo quiero manejar 100 de ellas cada vez (tipo de paginación). Es por eso que probé rownum para eso.

Gracias.

+2

event_table puede no ser vistas, pero '(SELECT * FROM event_table ...)' es una "vista" en el contexto de este mensaje de error. –

Respuesta

0

¿Qué es 'event_table'? Parece que 'event_table' es en realidad una vista cuyos resultados son un agregado (distinto, agrupado por, etc.). No podrá preparar resultados agregados para las actualizaciones. No estoy 100% seguro, pero rownum podría tener el mismo efecto ya que es indeterminado.

+0

He actualizado mi pregunta. tnx. – AmirT

10

funciona esto ?:

select * from event_table where id in 
(
    SELECT id 
    FROM (SELECT * 
     FROM event_table 
     WHERE status = 'S' 
     ORDER BY CREATION_DATA ASC) 
     WHERE ROWNUM <=10 
) 
FOR UPDATE; 
+0

bueno, la consulta tuvo éxito, la verificaré ahora si las filas están bloqueadas según sea necesario. muchas gracias. – AmirT