Cómo crear una tabla con datos manuales sobre la marcha.
Digamos que quiero definir algunos datos tabulares sobre la marcha para usar en una consulta, sin crear una tabla física:
+------------+------------+
|COLUMN_VALUE|COLUMN_VALUE|
+------------+------------+
|1 |a |
|2 |b |
|5 |e |
|4 |d |
|3 |c |
+------------+------------+
(nota el ordenamiento)
¿Cómo puedo hacer esto de la manera más sucinta y simple posible?
Lo que pude idear (no es muy bonito):
with
x as (
select
column_value
from
table (sys.odcinumberlist(1, 2, 5, 4, 3))),
y as (
select
column_value
from
table (sys.odcivarchar2list('a', 'b', 'e', 'd', 'c')))
select
x.column_value,
y.column_value
from
x
inner join y on x.rownum = y.rownum;
Sin embargo, esto no funciona, ya que da un error de ORA-01747: especificación de columna de usuario.tabla.columna, tabla.columna o columna no válida
. Aparentemente, la pseudocolumna rownum
no es compatible cuando se utiliza la función table()
incorporada.
Usar row_number() over (order by column_value asc)
en las CTE parece funcionar, pero fuerza el ordenamiento de los valores de las columnas. Esto es indeseable ya que los valores deben aparecer en el orden en que están definidos en la función de la tabla.
davy.ai
Para definir datos tabulares sobre la marcha sin crear una tabla física, puedes utilizar la cláusula
WITH
y la funciónTABLE()
para crear dos CTEs (Expresiones de Tabla Comunes). En la primera CTE, utilizaTABLE(sys.odcinumberlist(<lista de="" números="">))
para crear una tabla con una sola columna de números. En la segunda CTE, utilizaTABLE(sys.odcivarchar2list(<lista de="" caracteres="">))
para crear una tabla con una sola columna de caracteres. Luego, une las dos CTEs utilizandoROWNUM
para igualar las filas en función de su orden.Aquí tienes un ejemplo de código SQL para lograr esto:
Esto te dará el resultado deseado como se muestra en la pregunta, sin forzar ningún ordenamiento de los valores.