Sign in Join

Live chat for Free Pascal, Lazarus, Delphi and every Pascal programmer.

Mailing lists / lazarus-es / 2014-02

consulta sobre SQL para combinar tablas

13 messages · 7 people · –

Reply by email Subscribe to this list Your subscription

Read-only archive. Use j and k to move between messages.

Héctor F. Fiandor Rosario

Estimados colegas:

estoy haciendo una consulta que debe combinar datos de cuatro tablas usando SQLite3.

tomo como referencia lo siguiente, que obtuve de un tutorial sobre SQL
(*combinacion de varias tablas
  FROM '(tabla1 INNER JOIN tabla2 ON tabla1.index = tabla2.index) INNER JOIN (tabla1 INNER JOIN tabla3 ON tabla1.index = tabla3.index) INNER JOIN tabla4 ON tabla1.index = tabla4.index ';
*)

En mi caso tengo:

sqltext1 := ' SELECT NegSerAct.FecIniNegSerAct, NegSerAct.SemIniNegSerAct, NegSerAct.DuracionPlan,                NegSerAct.DuracionReal, ';
sqltext2 := ' Actividades.NomAct, ';
sqltext3 := ' Servicios.NomSer, ';
sqltext4 := ' Negocios.NomNegocio ';
sqltext5 := ' FROM (NegSerAct INNER JOIN Servicios ON NegSerAct.IDServicios = Servicios.IDServicios) INNER JOIN (NegSerAct INNER JOIN Actividades ON NegSerAct.IDSerAct = Actividades.IDActividades) INNER JOIN Negocios ON NegSerAct.IDNegocio = Negocios.IDNegocio  ';
sqltext6 := ' WHERE NegSerAct.SemIniNegSerAct = ' + selAnoSem +
                ' ORDER BY NegSerAct.IdNegocio ';
SQLText := sqltext1 + sqltext2 + sqltext3 + sqltext4 + sqltext5 + sqltext6;
fcPorSemana.tcPorSemana.SQL := SQLText;

Cuando ejecuto y trato de obtener el Reporte, me da un error que no existe Servicios.NomAct

Realizo otros Reportes usando tres tablas y funciona correctamente.

anticipandole las gracias por su ayuda,

Ing. H�ctor F. Fiandor Rosario
hfiandor en infomed.sld.cu

Este mensaje le ha llegado mediante el servicio de correo electronico que ofrece Infomed para respaldar el cumplimiento de las misiones del Sistema Nacional de Salud. La persona que envia este correo asume el compromiso de usar el servicio a tales fines y cumplir con las regulaciones establecidas Infomed: http://www.sld.cu/ ------------ pr�xima parte ------------ Se ha borrado un adjunto en formato HTML... URL: <http://lists.lazarus.freepascal.org/pipermail/lazarus-es/attachments/20140201/1305b205/attachment.html>

Reply by email

Ulises Díaz
to Héctor F. Fiandor Rosario

Buenas noches,
Se�or H�ctor por lo que veo hay que agregar el campo Servicios.NomAct al Select, quedando as�: SQLText := ' SELECT NegSerAct.FecIniNegSerAct, NegSerAct.SemIniNegSerAct, NegSerAct.DuracionPlan, NegSerAct.DuracionReal, ';SQLText += ' Actividades.NomAct, ';SQLText += ' Servicios.NomSer, ';SQLText += ' Negocios.NomNegocio, Servicios.NomAct ';SQLText += ' FROM (NegSerAct INNER JOIN Servicios ON NegSerAct.IDServicios = Servicios.IDServicios) INNER JOIN (NegSerAct INNER JOIN Actividades ON NegSerAct.IDSerAct = Actividades.IDActividades) INNER JOIN Negocios ON NegSerAct.IDNegocio = Negocios.IDNegocio ';SQLText += ' WHERE NegSerAct.SemIniNegSerAct = ' + selAnoSem + ' ORDER BY NegSerAct.IdNegocio ';

Puede resultar pr�ctico utilizar solo una variable para el texto de la consulta, en este caso solo utilizar�a la variable SQLText, asignandola en la primera linea y en las dem�s sumandole al contenido que tiene las dem�s strings con +=.

Cordialmente,
Ulises D�az

------------ pr�xima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://lists.lazarus.freepascal.org/pipermail/lazarus-es/attachments/20140201/fe49b2f1/attachment.html>

Reply by email

Rafael Bidegain
to Héctor F. Fiandor Rosario: Estimados colegas: estoy haciendo una consulta que debe combinar datos de cuatro tablas…

El 1 de febrero de 2014, 16:48, H�ctor F. Fiandor Rosario < hfiandor en infomed.sld.cu> escribi�:

Show quoted text 5 lines
Cuando ejecuto y trato de obtener el Reporte, me da un error que no existe Servicios.NomAct hola H�ctor

si la tabla servicios tiene un campo NomAct ten�s que incluirlo en el select.

por otra parte el error puede estar en uno de los campos del reporte, ya que la tabla que tiene el campo nomact es Actividades.

saludos

Rafael Bidegain Ya que los cuerdos no hablan, hablar� el loco. (The Fool, Padraic Pearse) # yo quiero educaci�n libre. �YA! ------------ pr�xima parte ------------ Se ha borrado un adjunto en formato HTML... URL: <http://lists.lazarus.freepascal.org/pipermail/lazarus-es/attachments/20140202/3725952d/attachment.html>

Reply by email

Ulises Díaz
to Héctor F. Fiandor Rosario: Estimados Ulises y Bidegain: pienso que el problema esta dado en mi declaraci�n de los…

Hola,
Intente reescribirla sin los par�ntesis y el segundo FROM que aparece, que tambi�n de puede as�:

 sqltext1 := ' SELECT NegSerAct.FecIniNegSerAct, NegSerAct.SemIniNegSerAct, NegSerAct.DuracionPlan, NegSerAct.DuracionReal, ';  sqltext2 := ' Servicios.NomSer, ';  sqltext3 := ' Actividades.NomAct ';  //sqltext4 := ' Negocios.NomNegocio ';  //sqltext5 := ' FROM NegSerAct INNER JOIN Servicios ON NegSerAct.IDServicios = Servicios.IDServicios INNER JOIN  Actividades ON NegSerAct.IDSerAct = Actividades.IDActividades INNER JOIN Negocios ON NegSerAct.IDNegocio = Negocios.IDNegocio  ';  sqltext5 := '  INNER JOIN Servicios ON NegSerAct.IDServicios = Servicios.IDServicios INNER JOIN  Actividades ON NegSerAct.IDSerAct = Actividades.IDActividades  ';  sqltext6 := ' WHERE NegSerAct.SemIniNegSerAct = ' + selAnoSem +              ' ORDER BY NegSerAct.IdNegocio ';

En forma general seria:
Select * from tabla1 INNER JOIN tabla2 on tabla1.id = tabla2.id INNER JOIN tabla3 on tabla3.id = tabla2.id WHERE y as� sucesivamente N tablas.
Espero que le sea de utilidad.

Reply by email

Rafael Bidegain
to Héctor F. Fiandor Rosario: Estimados Ulises y Bidegain: pienso que el problema esta dado en mi declaraci�n de los…

El 2 de febrero de 2014, 7:42, H�ctor F. Fiandor Rosario < hfiandor en infomed.sld.cu> escribi�:

Show quoted text 9 lines
Estimados Ulises y Bidegain: pienso que el problema esta dado en mi declaraci�n de los INNER JOIN, en mi primera preguna no puse bien el mensaje de error. al tanto de sus noticias, Hola H�ctor

a mi no me gusta usar join, me queda mucho mas claro lo que quiero hacer si uso where en lugar de join.

prob� usar where y si hay registros duplicados agreg� la clausula distinct.

Que yo sepa no hay ningun impedimento para que vincules 4 tablas (si lo hay deber�s cambiar de base de datos, porque eso es algo trivial)

si nos pas�s el mensaje de error correcto quiz�s podamos ayudarte un poco mas.

saludos

Ya que los cuerdos no hablan, hablar� el loco. (The Fool, Padraic Pearse) # yo quiero educaci�n libre. �YA! ------------ pr�xima parte ------------ Se ha borrado un adjunto en formato HTML... URL: <http://lists.lazarus.freepascal.org/pipermail/lazarus-es/attachments/20140202/b52be11e/attachment.html>

Reply by email

Héctor F. Fiandor Rosario
to Rafael Bidegain: El 1 de febrero de 2014, 16:48, H�ctor F. Fiandor Rosario < hfiandor en infomed.sld.cu>…

Estimados Ulises y Bidegain:

pienso que el problema esta dado en mi declaraci�n de los INNER JOIN, ya que como veran, si quito el NomNegocio y dejo solo tres tablas, entonces si funciona correctamente. Esto me lleva a pensar que no es un problema del Report ni de Actividades.NomAct, porque con tres tablas lo reproduce perfectamente.

les adjunto como dejo los SQLtext

  sqltext1 := ' SELECT NegSerAct.FecIniNegSerAct, NegSerAct.SemIniNegSerAct, NegSerAct.DuracionPlan, NegSerAct.DuracionReal, ';
  sqltext2 := ' Servicios.NomSer, ';
  sqltext3 := ' Actividades.NomAct ';
  //sqltext4 := ' Negocios.NomNegocio ';
  //sqltext5 := ' FROM ((NegSerAct INNER JOIN Servicios ON NegSerAct.IDServicios = Servicios.IDServicios) INNER JOIN (NegSerAct INNER JOIN Actividades ON NegSerAct.IDSerAct = Actividades.IDActividades)) INNER JOIN Negocios ON NegSerAct.IDNegocio = Negocios.IDNegocio  ';
  sqltext5 := ' FROM (NegSerAct INNER JOIN Servicios ON NegSerAct.IDServicios = Servicios.IDServicios) INNER JOIN  Actividades ON NegSerAct.IDSerAct = Actividades.IDActividades  ';
  sqltext6 := ' WHERE NegSerAct.SemIniNegSerAct = ' + selAnoSem +
              ' ORDER BY NegSerAct.IdNegocio ';
  SQLText := sqltext1 + sqltext2 + sqltext3 +  sqltext4 + sqltext5 + sqltext6;
  fcPorSemana.tcPorSemana.SQL := SQLText;

comente el sqltext4 y desvincule la tabla en el sqltext5. Quit� comas y parentesis que sobraban. El resto quedo igual y entonces si trabaja. En la tabla NegSerAct est�n todos los ID de las otras tablas vinculadas para los "emparejamientos".

O no se como hacer el INNER JOIN para cuatro tablas (si para tres) o el programa no admite mas de tres tablas (cosa que dudo para ser fiel a FPC).

en mi primera preguna no puse bien el mensaje de error.

al tanto de sus noticias,

Ing. H�ctor F. Fiandor Rosario
hfiandor en infomed.sld.cu

Este mensaje le ha llegado mediante el servicio de correo electronico que ofrece Infomed para respaldar el cumplimiento de las misiones del Sistema Nacional de Salud. La persona que envia este correo asume el compromiso de usar el servicio a tales fines y cumplir con las regulaciones establecidas Infomed: http://www.sld.cu/ ------------ pr�xima parte ------------ Se ha borrado un adjunto en formato HTML... URL: <http://lists.lazarus.freepascal.org/pipermail/lazarus-es/attachments/20140201/6c9f7a8c/attachment.html>

Reply by email

Maxi
to Héctor F. Fiandor Rosario: Estimados Bidegain y Ulises: parece que no me he sabido explicar bien mi problema. bueno,…

El d�a 2 de febrero de 2014, 16:50, H�ctor F. Fiandor Rosario <hfiandor en infomed.sld.cu> escribi�:

Show quoted text 28 lines
Estimados Bidegain y Ulises: parece que no me he sabido explicar bien mi problema. bueno, acab� no haciendo SQL, sino que cree una tabla nueva y en ella meti todo lo que necesitaba desde las cuatro tablas, y es la que leo para el Reporte. Esto trabaja al kilo. Despues voy a seguir investigando que le pasa a mi SQL anterior (parece que el INNER JOIN no esta bien), para aprender, pero ya el problema lo resolvi con la quinta tabla, que siempre la vacio al inicio y ocupa muy poco espacio en memoria. les agradezco la ayuda que tendre en cuenta para la revision posterior. saludos, Ing. H�ctor F. Fiandor Rosario hfiandor en infomed.sld.cu _______________________________________________ Lazarus-es mailing list Lazarus-es en lists.lazarus.freepascal.org http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es

Primero que nada cuando usas consultas te sugiero no hagas esas sumas de asignaciones, no es prolijo y pierdes el control de la sintaxis.

Te sugiero hagas de esta forma.

Const

miConsultaSQL= ' SELECT NegSerAct.FecIniNegSerAct, NegSerAct.SemIniNegSerAct, '+
' NegSerAct.DuracionPlan,NegSerAct.DuracionReal, '+ ' Actividades.NomAct, Servicios.NomSer,
Negocios.NomNegocio '+
' FROM (NegSerAct INNER JOIN Servicios ON
NegSerAct.IDServicios ='+
' Servicios.IDServicios) INNER JOIN
(NegSerAct INNER JOIN '+
' Actividades ON NegSerAct.IDSerAct =
Actividades.IDActividades) '+
' INNER JOIN Negocios ON NegSerAct.IDNegocio = '+
' Negocios.IDNegocio WHERE
NegSerAct.SemIniNegSerAct = %s '+

                          ' ORDER BY NegSerAct.IdNegocio ';

Despues antes de llamar a la consultas asignas la constante.

query1.sql:= Format(miconsultasql,
[QuotedStr(FormatDateTime('yyyy/mm/dd', mi variablefecha))]);

entonces conviertes la fecha a texto con el formato esperado segun el motor. Le agregas comillas para reemplazarlo por %s en la constante, incluso puedes usar parametros reemplazando el %s por :nombre parametroy llamar a paramByName() y asignar el valor.

Como veras esto es mas prolijo y facil de cambiar la consulta, incluso puede estar en un archivo externo y ser cargado al momento de usarlo.

El que pregunta aprende, y el que contesta aprende a responder. No a la obsolecencia programada: http://www.rtve.es/noticias/20110104/productos-consumo-duran-cada-vez-menos/392498.shtml Linux User #495070 http://domonetic.com/blog

Reply by email

Jose Antonio. Cuello Principal
to Héctor F. Fiandor Rosario: Estimados Bidegain y Ulises: parece que no me he sabido explicar bien mi problema. bueno,…

Hola, en vez de crear nuevas tablas porque no pruebas con crearte alguna vista que te simplifique la sql final ?

Por otro lado, si indicas el mensaje de error que da la sentencia select podr�a dar una pista sobre donde est� el error. Personalmente cuando escribo una select de multiples tablas prefiero hacerlo de la siguiente manera

SELECT < campos >
FROM tabla1
INNER JOIN tabla2 ON condicion
INNER JOIN tabla3 ON condicion
INNER JOIN tabla4 ON condicion
[ ... ]

de esta manera es muy sencillo leerla y revisar la condicion del join que falla. La verdad es que con tanto parentesis y poniendo varios join en la misma linea resulta tedioso de seguir. Y puedo asegurar que SQLITE (por lo menos la versi�n 3) funciona con muchos joins sin problemas y de manera r�pida.

Un cordial saludo.

Earlier message 16 lines
----- Mensaje original ----- De: "H�ctor F. Fiandor Rosario" <hfiandor en infomed.sld.cu> Para: "Spanish version of Lazarus List" <lazarus-es en lists.lazarus.freepascal.org> Enviados: Domingo, 2 de Febrero 2014 20:50:31 Asunto: Re: [Lazarus-es] consulta sobre SQL para combinar tablas Estimados Bidegain y Ulises: parece que no me he sabido explicar bien mi problema. bueno, acab� no haciendo SQL, sino que cree una tabla nueva y en ella meti todo lo que necesitaba desde las cuatro tablas, y es la que leo para el Reporte. Esto trabaja al kilo. Despues voy a seguir investigando que le pasa a mi SQL anterior (parece que el INNER JOIN no esta bien), para aprender, pero ya el problema lo resolvi con la quinta tabla, que siempre la vacio al inicio y ocupa muy poco espacio en memoria. les agradezco la ayuda que tendre en cuenta para la revision posterior. saludos, Ing. H�ctor F. Fiandor Rosario hfiandor en infomed.sld.cu

Reply by email

Paola Bruccoleri
to Héctor F. Fiandor Rosario: Estimados Bidegain y Ulises: parece que no me he sabido explicar bien mi problema. bueno,…

El 02/02/2014 17:50, H�ctor F. Fiandor Rosario escribi�:

Show quoted text 14 lines
Estimados Bidegain y Ulises: parece que no me he sabido explicar bien mi problema. bueno, acab� no haciendo SQL, sino que cree una tabla nueva y en ella meti todo lo que necesitaba desde las cuatro tablas, y es la que leo para el Reporte. Esto trabaja al kilo. Despues voy a seguir investigando que le pasa a mi SQL anterior (parece que el INNER JOIN no esta bien), para aprender, pero ya el problema lo resolvi con la quinta tabla, que siempre la vacio al inicio y ocupa muy poco espacio en memoria. les agradezco la ayuda que tendre en cuenta para la revision posterior. saludos, Ing. H�ctor F. Fiandor Rosario hfiandor en infomed.sld.cu <mailto:hfiandor en infomed.sld.cu>

Hola H�ctor..
no desistas de usar los join! :) seguramente es algo sencillo... Como consejo que a mi personalmente me sirve, te digo que las consultas sql que necesito las hago siempre desde alg�n utilitario que me permita acceder a la bd; en mi caso como uso firebird, uno de los que uso es ibexpert, pero para las bd sqlite puedes usar SQLite Manager que es un complemento de firefox.
All� descartas enseguida los problemas que te pueden aparecer porque vas probando m�s f�cilmente.
Adem�s:
- yo sacar�a los par�ntesis que pusistes en los inner joins
- usar�a alias para las tablas para que me quede m�s clara la consulta y m�s corta
- har�a todo lo que te sugirieron los dem�s compa�eros.. Bueno, dp nos cuentas c�mo te fue!

byeeeeeeee

------------ pr�xima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://lists.lazarus.freepascal.org/pipermail/lazarus-es/attachments/20140202/c807f781/attachment.html>

Reply by email

Maxi
to Paola Bruccoleri

No es mala idea los joins, por el contratio motores como mysql son mas rapidas las consultas, porque est� optimizado para el uso de joins. Las vistas son mejor aun porque ya se encuentran pre-interpretadas por el motor.
Y te dan ventajas adicionales de no modificar codigo si cambias algo en la vista.

El que pregunta aprende, y el que contesta aprende a responder. No a la obsolecencia programada: http://www.rtve.es/noticias/20110104/productos-consumo-duran-cada-vez-menos/392498.shtml Linux User #495070 http://domonetic.com/blog

Reply by email

Héctor F. Fiandor Rosario
to Ulises Díaz: Intente reescribirla sin los par�ntesis y el segundo FROM que aparece, que tambi�n de…

Estimados Bidegain y Ulises:

parece que no me he sabido explicar bien mi problema.

bueno, acab� no haciendo SQL, sino que cree una tabla nueva y en ella meti todo lo que necesitaba desde las cuatro tablas, y es la que leo para el Reporte. Esto trabaja al kilo.

Despues voy a seguir investigando que le pasa a mi SQL anterior (parece que el INNER JOIN no esta bien), para aprender, pero ya el problema lo resolvi con la quinta tabla, que siempre la vacio al inicio y ocupa muy poco espacio en memoria.

les agradezco la ayuda que tendre en cuenta para la revision posterior.

saludos,

Ing. H�ctor F. Fiandor Rosario
hfiandor en infomed.sld.cu

Este mensaje le ha llegado mediante el servicio de correo electronico que ofrece Infomed para respaldar el cumplimiento de las misiones del Sistema Nacional de Salud. La persona que envia este correo asume el compromiso de usar el servicio a tales fines y cumplir con las regulaciones establecidas Infomed: http://www.sld.cu/ ------------ pr�xima parte ------------ Se ha borrado un adjunto en formato HTML... URL: <http://lists.lazarus.freepascal.org/pipermail/lazarus-es/attachments/20140202/2cc13810/attachment.html>

Reply by email

Maikel Enrique Pernía Matos
to Héctor F. Fiandor Rosario

H�ctor F:

Prueba este SQL al parecer ten�as un �INNER JOIN� de m�s, aunque sin la estructura de la BD (tablas, campos y relaciones) es poco dif�cil verificar si esto resuelve tu problema, puedes indagar sobre: LEFT OUTER JOIN y RIGHT OUTER JOIN, otras forma de convinar tablas; que dependiendo del caso es mejor que el tradicional �INNER JOIN�

<sql-code>
SELECT
NegSerAct.FecIniNegSerAct,
NegSerAct.SemIniNegSerAct,
NegSerAct.DuracionPlan,
NegSerAct.DuracionReal,
Actividades.NomAct,
Servicios.NomSer,
Negocios.NomNegocio
FROM
NegSerAct
INNER JOIN Servicios ON NegSerAct.IDServicios = Servicios.IDServicios INNER JOIN Actividades ON NegSerAct.IDSerAct = Actividades.IDActividades INNER JOIN Negocios ON NegSerAct.IDNegocio = Negocios.IDNegocio WHERE NegSerAct.SemIniNegSerAct = selAnoSem
ORDER BY NegSerAct.IdNegocio;
</sql-code>

Saludos

Show quoted text 39 lines
Estimados Bidegain y Ulises: parece que no me he sabido explicar bien mi problema. bueno, acab� no haciendo SQL, sino que cree una tabla nueva y en ella meti todo lo que necesitaba desde las cuatro tablas, y es la que leo para el Reporte. Esto trabaja al kilo. Despues voy a seguir investigando que le pasa a mi SQL anterior (parece que el INNER JOIN no esta bien), para aprender, pero ya el problema lo resolvi con la quinta tabla, que siempre la vacio al inicio y ocupa muy poco espacio en memoria. les agradezco la ayuda que tendre en cuenta para la revision posterior. saludos, Ing. H�ctor F. Fiandor Rosario hfiandor en infomed.sld.cu -- Este mensaje le ha llegado mediante el servicio de correo electronico que ofrece Infomed para respaldar el cumplimiento de las misiones del Sistema Nacional de Salud. La persona que envia este correo asume el compromiso de usar el servicio a tales fines y cumplir con las regulaciones establecidas Infomed: http://www.sld.cu/ _______________________________________________ Lazarus-es mailing list Lazarus-es en lists.lazarus.freepascal.org http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es
Este mensaje le ha llegado mediante el servicio de correo electronico que ofrece Infomed para respaldar el cumplimiento de las misiones del Sistema Nacional de Salud. La persona que envia este correo asume el compromiso de usar el servicio a tales fines y cumplir con las regulaciones establecidas Infomed: http://www.sld.cu/

Reply by email

Héctor F. Fiandor Rosario
to Jose Antonio. Cuello Principal: Hola, en vez de crear nuevas tablas porque no pruebas con crearte alguna vista que te…

Estimados colegas:

gracias por todas las respuestas recibidas, en especial la de Jose Antonio.Cuello Principal.

simplemente arregle la instruccion SQL quitando parentesis y poniendola como me indico Jose Antonio, compile y todo salio a pedir de boca.

Muchas gracias a todos.

saludos,

Ing. H�ctor F. Fiandor Rosario
hfiandor en infomed.sld.cu

Este mensaje le ha llegado mediante el servicio de correo electronico que ofrece Infomed para respaldar el cumplimiento de las misiones del Sistema Nacional de Salud. La persona que envia este correo asume el compromiso de usar el servicio a tales fines y cumplir con las regulaciones establecidas Infomed: http://www.sld.cu/ ------------ pr�xima parte ------------ Se ha borrado un adjunto en formato HTML... URL: <http://lists.lazarus.freepascal.org/pipermail/lazarus-es/attachments/20140203/11b44bc0/attachment.html>

Reply by email