Página 1 de 1

Probema SQLIte con SELECT anidadas

Publicado: Lun Sep 05, 2011 11:08 am
por jasm.quitaesto
Hola
Tengo esta select que desde el programa xasqlite.exe funciona
correctamente, pero desde Xailer 2.0.18 no va:
SELECT libro.*, (SELECT librocurso.precio FROM librocurso INNER JOIN
colegiocursolibro ON librocurso.id_colegiocursolibro =
colegiocursolibro.id WHERE colegiocursolibro.id_convocatoria =
1 AND id_libro = libro.id ) AS precio FROM libro WHERE baja = 0 AND tipo
= 'L' ORDER BY libro.titulo
Error de Xailer 2.0.18 en imagen adjunta.
Saludos
Jose A. Suarez
--

Probema SQLIte con SELECT anidadas

Publicado: Mar Sep 06, 2011 11:36 am
por jasm.quitaesto
Será un problema sin solución o algo así­, no se. ;-)
A lo mejor nadie ha necesitado hacer SELECT anidadas nunca.
Saludos
José A. Suárez
El 05/09/2011 11:08, José Alfonso Suárez Moreno escribió:
> Hola
>
> Tengo esta select que desde el programa xasqlite.exe funciona
> correctamente, pero desde Xailer 2.0.18 no va:
>
> SELECT libro.*, (SELECT librocurso.precio FROM librocurso INNER JOIN
> colegiocursolibro ON librocurso.id_colegiocursolibro =
> colegiocursolibro.id WHERE colegiocursolibro.id_convocatoria = 1 AND
> id_libro = libro.id ) AS precio FROM libro WHERE baja = 0 AND tipo = 'L'
> ORDER BY libro.titulo
>
> Error de Xailer 2.0.18 en imagen adjunta.
>
> Saludos
>
> Jose A. Suarez
>

Probema SQLIte con SELECT anidadas

Publicado: Mar Sep 27, 2011 1:06 pm
por jasm.quitaesto
¿Ninguna pista de que puede estar pasando?
Gracias.
El 05/09/2011 11:08, José Alfonso Suárez Moreno escribió:
> Hola
>
> Tengo esta select que desde el programa xasqlite.exe funciona
> correctamente, pero desde Xailer 2.0.18 no va:
>
> SELECT libro.*, (SELECT librocurso.precio FROM librocurso INNER JOIN
> colegiocursolibro ON librocurso.id_colegiocursolibro =
> colegiocursolibro.id WHERE colegiocursolibro.id_convocatoria = 1 AND
> id_libro = libro.id ) AS precio FROM libro WHERE baja = 0 AND tipo = 'L'
> ORDER BY libro.titulo
>
> Error de Xailer 2.0.18 en imagen adjunta.
>
> Saludos
>
> Jose A. Suarez
>

Probema SQLIte con SELECT anidadas

Publicado: Mar Sep 27, 2011 1:46 pm
por jfgimenez
José Alfonso,
> Será un problema sin solución o algo así­, no se. ;-)
>
> A lo mejor nadie ha necesitado hacer SELECT anidadas nunca.
Esto está sacado directamente de un programa mio:
TEXT INTO cSql
SELECT Amarres.Codigo AS
Codigo,Zona,Dimensiones,Barco,NBarco,ClaveT,ClaveTip,ClavePo s,Fecha,Reservado,NReservado,
Descrip FROM Amarres
LEFT JOIN Zonas ON Zona=Zonas.Codigo
LEFT JOIN
(SELECT Destino,Barco,Fecha FROM
(SELECT * FROM
(SELECT * FROM
(SELECT * FROM
(SELECT Destino, Barco, Fecha FROM Historico WHERE
Fecha<=? ORDER BY &cORDEN.) t1
GROUP BY Barco) t2
GROUP BY Destino) t3
WHERE Destino IS NOT NULL) t4
LEFT JOIN Barcos ON Barco=Barcos.Codigo) t5
ON Amarres.Codigo=Destino
LEFT JOIN Barcos ON Barco=Barcos.Codigo
LEFT JOIN
(SELECT Reservas.Amarre AS ReservaAmarre,Barco AS Reservado, NBarco
AS NReservado FROM Reservas
LEFT JOIN Barcos ON Barco=Codigo
WHERE DeFecha<=? AND (Year(AFecha)=0 OR AFecha>=?) ) t6
ON ReservaAmarre=Amarres.Codigo
ENDTEXT
IF !Empty( ::oDeAmarre:Value )
cWhere += " AND Amarres.Codigo >= '" + Trim( ::oDeAmarre:Value ) + "'"
ENDIF
cWhere += " AND Amarres.Codigo <= '" + Trim( ::oAAmarre:Value ) + "'"
IF !Empty( ::oDeZona:Value )
cWhere += " AND Amarres.Zona >= '" + Trim( ::oDeZona:Value ) + "'"
ENDIF
cWhere += " AND Amarres.Zona <= '" + Trim( ::oAZona:Value ) + "'"
cSql += " WHERE " + Substr( cWhere, 6 ) + ;
" ORDER BY Amarres.Zona,Amarres.Codigo"
oData := oDB:QueryReport( oDB:BuildSqlSt( cSql, ::oFecha:Value,
::oFecha:Value, ::oFecha:Value ) )
Está funcionando perfectamente tanto en SQLite como en MySQL, y no creo que
se pueda decir que es una sentencia simple o sencilla. Y como puedes ver, sí­
hay sentencias anidadas.
Envianos un ejemplo autocontenido que podamos ejecutar para comprobarlo.
--
Un saludo,
José F. Giménez
http://www.xailer.com
http://www.xailer.info

Probema SQLIte con SELECT anidadas

Publicado: Mar Sep 27, 2011 10:15 pm
por jasm.quitaesto
Hola Jose,
Gracias por reponder.
Si te fijas en la imagen que adjunto en el mensaje, hay una columna
precio._RowId_ AS RowId que yo no he puesto. Aunque fuese algo necesario
para el DS, la no hay en el where ni en los inner ninguna tabla precio.
La SELECT mia es:
SELECT libro.*, (SELECT librocurso.precio FROM librocurso INNER JOIN
colegiocursolibro ON librocurso.id_colegiocursolibro =
colegiocursolibro.id WHERE colegiocursolibro.id_convocatoria = 1 AND
id_libro = libro.id ) AS precio FROM libro WHERE baja = 0 AND tipo = 'L'
ORDER BY libro.titulo
Veré si puedo hacer un ejemplo y mandarlo, pero creo que no es necesario.
Saludos
Jose Alfonso Suarez
El 27/09/2011 13:46, Jose F. Gimenez escribió:
> José Alfonso,
>
>> Será un problema sin solución o algo así­, no se. ;-)
>>
>> A lo mejor nadie ha necesitado hacer SELECT anidadas nunca.
>
> Esto está sacado directamente de un programa mio:
>
> TEXT INTO cSql
> SELECT Amarres.Codigo AS
> Codigo,Zona,Dimensiones,Barco,NBarco,ClaveT,ClaveTip,ClavePo s,Fecha,Reservado,NReservado,
> Descrip FROM Amarres
> LEFT JOIN Zonas ON Zona=Zonas.Codigo
> LEFT JOIN
> (SELECT Destino,Barco,Fecha FROM
> (SELECT * FROM
> (SELECT * FROM
> (SELECT * FROM
> (SELECT Destino, Barco, Fecha FROM Historico WHERE Fecha<=? ORDER BY
> &cORDEN.) t1
> GROUP BY Barco) t2
> GROUP BY Destino) t3
> WHERE Destino IS NOT NULL) t4
> LEFT JOIN Barcos ON Barco=Barcos.Codigo) t5
> ON Amarres.Codigo=Destino
> LEFT JOIN Barcos ON Barco=Barcos.Codigo
> LEFT JOIN
> (SELECT Reservas.Amarre AS ReservaAmarre,Barco AS Reservado, NBarco AS
> NReservado FROM Reservas
> LEFT JOIN Barcos ON Barco=Codigo
> WHERE DeFecha<=? AND (Year(AFecha)=0 OR AFecha>=?) ) t6
> ON ReservaAmarre=Amarres.Codigo
> ENDTEXT
>
> IF !Empty( ::oDeAmarre:Value )
> cWhere += " AND Amarres.Codigo >= '" + Trim( ::oDeAmarre:Value ) + "'"
> ENDIF
> cWhere += " AND Amarres.Codigo <= '" + Trim( ::oAAmarre:Value ) + "'"
>
> IF !Empty( ::oDeZona:Value )
> cWhere += " AND Amarres.Zona >= '" + Trim( ::oDeZona:Value ) + "'"
> ENDIF
> cWhere += " AND Amarres.Zona <= '" + Trim( ::oAZona:Value ) + "'"
>
> cSql += " WHERE " + Substr( cWhere, 6 ) + ;
> " ORDER BY Amarres.Zona,Amarres.Codigo"
>
> oData := oDB:QueryReport( oDB:BuildSqlSt( cSql, ::oFecha:Value,
> ::oFecha:Value, ::oFecha:Value ) )
>
>
> Está funcionando perfectamente tanto en SQLite como en MySQL, y no creo
> que se pueda decir que es una sentencia simple o sencilla. Y como puedes
> ver, sí­ hay sentencias anidadas.
>
> Envianos un ejemplo autocontenido que podamos ejecutar para comprobarlo.
>

Probema SQLIte con SELECT anidadas

Publicado: Mié Sep 28, 2011 11:47 am
por jasm.quitaesto
Hola Jose,
La diferencia entre la SELECT que tu pones aquí­ y la mí­a es que en
anidamiento lo haces en el JOIN, mientras que el mio está hecho en las
columnas. Algo debe estar haciendo mal el pharser que toma "AS precio"
como si fuese una tabla.
Saludos
Jose A.
El 27/09/2011 13:46, Jose F. Gimenez escribió:
> José Alfonso,
>
>> Será un problema sin solución o algo así­, no se. ;-)
>>
>> A lo mejor nadie ha necesitado hacer SELECT anidadas nunca.
>
> Esto está sacado directamente de un programa mio:
>
> TEXT INTO cSql
> SELECT Amarres.Codigo AS
> Codigo,Zona,Dimensiones,Barco,NBarco,ClaveT,ClaveTip,ClavePo s,Fecha,Reservado,NReservado,
> Descrip FROM Amarres
> LEFT JOIN Zonas ON Zona=Zonas.Codigo
> LEFT JOIN
> (SELECT Destino,Barco,Fecha FROM
> (SELECT * FROM
> (SELECT * FROM
> (SELECT * FROM
> (SELECT Destino, Barco, Fecha FROM Historico WHERE Fecha<=? ORDER BY
> &cORDEN.) t1
> GROUP BY Barco) t2
> GROUP BY Destino) t3
> WHERE Destino IS NOT NULL) t4
> LEFT JOIN Barcos ON Barco=Barcos.Codigo) t5
> ON Amarres.Codigo=Destino
> LEFT JOIN Barcos ON Barco=Barcos.Codigo
> LEFT JOIN
> (SELECT Reservas.Amarre AS ReservaAmarre,Barco AS Reservado, NBarco AS
> NReservado FROM Reservas
> LEFT JOIN Barcos ON Barco=Codigo
> WHERE DeFecha<=? AND (Year(AFecha)=0 OR AFecha>=?) ) t6
> ON ReservaAmarre=Amarres.Codigo
> ENDTEXT
>
> IF !Empty( ::oDeAmarre:Value )
> cWhere += " AND Amarres.Codigo >= '" + Trim( ::oDeAmarre:Value ) + "'"
> ENDIF
> cWhere += " AND Amarres.Codigo <= '" + Trim( ::oAAmarre:Value ) + "'"
>
> IF !Empty( ::oDeZona:Value )
> cWhere += " AND Amarres.Zona >= '" + Trim( ::oDeZona:Value ) + "'"
> ENDIF
> cWhere += " AND Amarres.Zona <= '" + Trim( ::oAZona:Value ) + "'"
>
> cSql += " WHERE " + Substr( cWhere, 6 ) + ;
> " ORDER BY Amarres.Zona,Amarres.Codigo"
>
> oData := oDB:QueryReport( oDB:BuildSqlSt( cSql, ::oFecha:Value,
> ::oFecha:Value, ::oFecha:Value ) )
>
>
> Está funcionando perfectamente tanto en SQLite como en MySQL, y no creo
> que se pueda decir que es una sentencia simple o sencilla. Y como puedes
> ver, sí­ hay sentencias anidadas.
>
> Envianos un ejemplo autocontenido que podamos ejecutar para comprobarlo.
>