es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para definir datos tabulares sobre la marcha sin crear una tabla física, puedes utilizar la cláusula WITH y la función TABLE() para crear dos CTEs (Expresiones de Tabla Comunes). En la primera CTE, utiliza TABLE(sys.odcinumberlist(<lista de="" números="">)) para crear una tabla con una sola columna de números. En la segunda CTE, utiliza TABLE(sys.odcivarchar2list(<lista de="" caracteres="">)) para crear una tabla con una sola columna de caracteres. Luego, une las dos CTEs utilizando ROWNUM para igualar las filas en función de su orden.

    Aquí tienes un ejemplo de código SQL para lograr esto:

    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
    JOIN y ON x.rownum = y.rownum;
    

    Esto te dará el resultado deseado como se muestra en la pregunta, sin forzar ningún ordenamiento de los valores.

Comments are closed.