repetir - sql eliminar registros repetidos dejando solo 1
Columnas duplicadas en la consulta de Oracle usando la cláusula de limitación de fila (2)
Desde Oracle 12c, finalmente podemos usar la cláusula de limitación de fila estándar de SQL de esta manera:
SELECT * FROM t FETCH FIRST 10 ROWS ONLY
Ahora, en Oracle 12.1, había una limitación que es bastante molesta al unir tablas. No es posible tener dos columnas del mismo nombre en la cláusula SELECT
, cuando se utiliza la cláusula de limitación de fila. Por ejemplo, esto plantea ORA-00918 en Oracle 12.1
SELECT t.id, u.id FROM t, u FETCH FIRST 10 ROWS ONLY
Esta es una restricción que está documentada en el manual para todas las versiones 12.1, 12.2, 18.0 :
La solución es, obviamente, alias las columnas.
SELECT t.id AS t_id, u.id AS u_id FROM t, u FETCH FIRST 10 ROWS ONLY
O recurrir a la paginación "clásica" usando las funciones ROWNUM
o window.
Curiosamente, sin embargo, la consulta original con columnas de ID
ambiguas se ejecuta bien a partir de Oracle 12.2 en adelante. ¿Es este un error de documentación, o una característica no documentada?
Me di cuenta de que tienes una unión implícita. Sería interesante ver si el problema desaparece al unirse explícitamente. Me pregunto si detrás de escena Oracle está realizando una unión basada en id = id y no está utilizando los alias de tabla que les asignó.
Eso también explicaría los alias de columnas que solucionan el problema. Intenta unirte explícitamente; eso podría forzar a Oracle a usar los alias de la tabla y resolver la ambigüedad que cree que ve.
Parece que en este caso, cuando utiliza la cláusula de limitación de fila, Oracle llama internamente a la función ROW_NUMBER()
donde utiliza el nombre de columna en la cláusula OVER
como ROW_NUMBER OVER(ORDER BY ID)
. Debido a esto, está recibiendo el ORA-00918 error
.