usando subquery en CTE en alquimia sql en servidor sql

He dado una tarea para convertir una consulta que está en zsql a sql alquimy que tiene un CTE con sub-queries. Me convertí, pero cuando genero la consulta convertida, los argumentos no están siendo aprobados correctamente. Por ejemplo, en la parte inferior

FROM   table1
JOIN  table2
 ON     table1.col1 = table2.col2
  AND    table1.col3 = 'Y'

Aquí, el col3 = 'Y' debe ser un valor entero y se está imprimiendo correctamente en sub-query, pero cuando me integre con cte, está causando este problema.

La estructura de mi consulta es como abajo,

With cteqry as (Select ...
left join (subquery1)
left join (subquery2)
)

Select cteqry .*, ...

El código Python para ejecutar la consulta anterior es como abajo,

sub_queryobj1 = (self.session.query(db.Table2.col2).filter(idn == 20))
   
    enc_proc_main_ct = (self.session.query(db.Table1.col1, ..
                                               ).outerjoin (sub_queryobj1, (db.Table1.col1 == sub_queryobj1.c.col1)
    
    )

Aquí, enc_proc_main_ct es el objeto cte query tiene el objeto sub-query enc_proc_main_ct dentro de ese

Pregunta hecha hace 3 años, 4 meses, 28 días - Por codemaster89


2 Respuestas:

  • Para resolver el problema con el valor entero 'Y' en la subquery, puedes convertirlo explícitamente a un entero en la subquery misma. Puedes hacerlo utilizando la función cast de SQL. Aquí te muestro un ejemplo de cómo podrías ajustar tu consulta y código Python:

    En la parte de la consulta en SQL con CTE:

    sql
    With cteqry as (
        Select ...
        left join (subquery1)
        left join (subquery2)
    )
    
    Select cteqry.*, ...
    

    Puedes ajustar la subquery1 para convertir el valor 'Y' a un entero utilizando cast:

    sql
    subquery1 as (Select col1, col2, col3, cast('Y' as int) as converted_col
                  From table3
                  Where ...)
    

    En cuanto al código Python, puedes hacer lo siguiente para integrar la subquery corregida:

    python
    from sqlalchemy import cast, Integer
    
    sub_queryobj1 = (self.session.query(db.Table2.col2).filter(idn == 20))
    
    enc_proc_main_ct = (self.session.query(db.Table1.col1, ..
                                       ).outerjoin(sub_queryobj1, (db.Table1.col1 == sub_queryobj1.c.col1))
                                       .add_columns(cast('Y', Integer).label('converted_col'))
    

    Al usar cast('Y', Integer) en el código Python, estás indicando explícitamente que deseas convertir el valor 'Y' a un entero en la consulta. Esto debería resolver el problema de integración y permitir que el valor sea tratado como un entero en la subquery dentro de tu CTE.

    Respondida el Dec 19, 2020 a las 16:37 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Problema:

    Cuando se utiliza una subconsulta en una expresión de tabla común (CTE) en SQLAlchemy, los argumentos de la subconsulta no se pasan correctamente.

    Solución:

    Utiliza el método from_self() para referenciar la CTE dentro de la subconsulta. Este método crea una referencia a la CTE con el mismo alias que se utiliza en la declaración CTE.

    Código actualizado:

    python
    sub_queryobj1 = (self.session.query(db.Table2.col2).filter(idn == 20))
    
    enc_proc_main_ct = (self.session.query(db.Table1.col1, ...)
                           .outerjoin(sub_queryobj1, db.Table1.col1 == sub_queryobj1.from_self().col1)
                           )
    

    Explicación:

    El método from_self() crea una referencia a cteqry dentro de la subconsulta sub_queryobj1, utilizando el alias cteqry de la declaración CTE. Esto garantiza que los argumentos de la subconsulta se pasen correctamente a la CTE.

    Respondida el Dec 19, 2020 a las 16:47 - por Gemini

    Votos positivos: 0 | Votos negativos: 0