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 acteqry
dentro de la subconsultasub_queryobj1
, utilizando el aliascteqry
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