Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 25-11-2005
Luis Castillo Luis Castillo is offline
Miembro
 
Registrado: jun 2003
Ubicación: Colombia
Posts: 102
Poder: 21
Luis Castillo Va por buen camino
Problema con Joins

ha ver colegas si me pueden ayudar con esta consultica...

Acabo de enterarme de la utilidad de la clausula JOIN del SQL...super util. Pero he encontrado un tropiezo:

Tengo la tabla ELECTOR(Cedula, Nombre, Direccion..etc)
La tabla DETELECTOR(Cedula, IdeCiudadEleccion)
La tabla CIUDAD(IdeCiudad, nombreCiudad)

Y quiero mostrar todos los electores con la ciudad de eleccion de cada uno, para ello utilizo el INNER JOIN con DETELECTOR (porque debo mostrar solo los que tengan por lo menos una fila en esta tabla). Pero en esta misma consulta debo mostrar el nombre de la CIUDADELECCION, y aqui no todos tienen...pero quiero que aparezca de todos modos un espacio en blanco (para esto es el LEFT JOIN)

Creo que estos son left anidados....

Esta es la consulta:

Select E.Cedula, E.Nombres, E.Apellidos, TE.Nombre TipoElector, G.Nombre grupo, D.Nombre DepartamentoOrigen, M.Nombre MunicipioOrigen
From Elector E, Grupo G, TipoElector TE
INNER Join (DetElector DE Left Join Elector E2 On DE.CedLider=E2.Cedula) On E.cedula=DE.Cedula
Left Join Depto D On E.IdeDeptoOrigen=D.IdeDepto
Left Join Mpio M On E.IdeOrigen=M.IdeMpio
Where E.IdeGrupo=G.IdeGrupo
And E.IdeTipoElector=TE.IdeTipoElector


Pero me sale un error INVALID PARAMETER....

que no tengo idea de que se trata.....

Cualquier ayuda es buena....

Muchas graciAS....
__________________
LK
Responder Con Cita
  #2  
Antiguo 25-11-2005
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
Que tal Luis.

¿todavía sin usar etiquetas?

Esta vez será mejor que edites tu mensaje y las coloques. ¿todavía no sabes usarlas?, pues epa... el vínculo a la ayuda de la etiqueta [code] está en mi firma, y la etiqueta [sql] se usa igual.

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #3  
Antiguo 26-11-2005
Luis Castillo Luis Castillo is offline
Miembro
 
Registrado: jun 2003
Ubicación: Colombia
Posts: 102
Poder: 21
Luis Castillo Va por buen camino
Aclaracion...

Tienes razon.....que tal ahora.....
Te agradezco cualquier ayuda..

ha ver colegas si me pueden ayudar con esta consultica...

Acabo de enterarme de la utilidad de la clausula JOIN del SQL...super util. Pero he encontrado un tropiezo:

Código:
Tengo la tabla ELECTOR(Cedula, Nombre, Direccion..etc)
La tabla DETELECTOR(Cedula, IdeCiudadEleccion)
La tabla CIUDAD(IdeCiudad, nombreCiudad)
Y quiero mostrar todos los electores con la ciudad de eleccion de cada uno, para ello utilizo el INNER JOIN con DETELECTOR (porque debo mostrar solo los que tengan por lo menos una fila en esta tabla). Pero en esta misma consulta debo mostrar el nombre de la CIUDADELECCION, y aqui no todos tienen...pero quiero que aparezca de todos modos un espacio en blanco (para esto es el LEFT JOIN)

Creo que estos son left anidados....

Esta es la consulta:

Código PHP:
Select E.CedulaE.NombresE.ApellidosTE.Nombre TipoElectorG.Nombre grupoD.Nombre DepartamentoOrigenM.Nombre MunicipioOrigen
From Elector E
Grupo GTipoElector TE
INNER Join 
(DetElector DE Left Join Elector E2 On DE.CedLider=E2.CedulaOn E.cedula=DE.Cedula
Left Join Depto D On E
.IdeDeptoOrigen=D.IdeDepto
Left Join Mpio M On E
.IdeOrigen=M.IdeMpio
Where E
.IdeGrupo=G.IdeGrupo
And E.IdeTipoElector=TE.IdeTipoElector 
Pero me sale un error INVALID PARAMETER....

que no tengo idea de que se trata.....

Cualquier ayuda es buena....

Muchas graciAS....
__________________
LK
Responder Con Cita
  #4  
Antiguo 28-11-2005
lbuelvas lbuelvas is offline
Miembro
 
Registrado: may 2003
Ubicación: Colombia
Posts: 377
Poder: 22
lbuelvas Va por buen camino
Disculpa mi ignorancia sobre tu diseño de la base de datos pero si es algo de elecciones no se supone que la persona solo debe estar registrada en una unica ciudad (por lo menos asi es en Colombia), si ese es tu caso deberias colocar un atributo en la tabla ELECTOR para manejar el codigo de la ciudad y podrias eliminar la tabla DETELECTOR. Esto se debe a que segun el diseño que has mostrado una persona puede aparecer en mas de una ciudad.

Sin embargo esta es una consulta para que puedas ver las personas asi no tengan determinado el lugar de eleccion.

Coloco las estructuras y unos datos de prueba para los que quieran recrear la consulta y ademas porque tu consulta hace referencia a unas tablas que desconozco:

Código SQL [-]
CREATE TABLE ELECTOR (
    CEDULA     INTEGER NOT NULL,
    NOMBRE     VARCHAR(10) NOT NULL,
    DIRECCION  VARCHAR(10)
);

ALTER TABLE ELECTOR ADD CONSTRAINT PK_ELECTOR PRIMARY KEY (CEDULA);

CREATE TABLE CIUDAD (
    IDECIUDAD     INTEGER NOT NULL,
    NOMBRECIUDAD  VARCHAR(10) NOT NULL
);

ALTER TABLE CIUDAD ADD CONSTRAINT PK_CIUDAD PRIMARY KEY (IDECIUDAD);

CREATE TABLE DETELECTOR (
    CEDULA          INTEGER NOT NULL,
    CIUDADELECCION  INTEGER NOT NULL
);

ALTER TABLE DETELECTOR ADD CONSTRAINT PK_DETELECTOR PRIMARY KEY (CEDULA, CIUDADELECCION);
ALTER TABLE DETELECTOR ADD CONSTRAINT FK_DETELECTOR_CIUDAD FOREIGN KEY (CIUDADELECCION) REFERENCES CIUDAD (IDECIUDAD);
ALTER TABLE DETELECTOR ADD CONSTRAINT FK_DETELECTOR_ELECTOR FOREIGN KEY (CEDULA) REFERENCES ELECTOR (CEDULA);

Los datos:

Código SQL [-]
INSERT INTO ELECTOR (CEDULA, NOMBRE, DIRECCION) VALUES (1, 'PACO', NULL);
INSERT INTO ELECTOR (CEDULA, NOMBRE, DIRECCION) VALUES (2, 'HUGO', NULL);
INSERT INTO ELECTOR (CEDULA, NOMBRE, DIRECCION) VALUES (3, 'LUIS', NULL);
INSERT INTO ELECTOR (CEDULA, NOMBRE, DIRECCION) VALUES (4, 'FERNANDO', NULL);
INSERT INTO ELECTOR (CEDULA, NOMBRE, DIRECCION) VALUES (5, 'ANGELA', NULL);
INSERT INTO ELECTOR (CEDULA, NOMBRE, DIRECCION) VALUES (6, 'PATRICIA', NULL);
INSERT INTO ELECTOR (CEDULA, NOMBRE, DIRECCION) VALUES (7, 'JOSE', NULL);

INSERT INTO CIUDAD (IDECIUDAD, NOMBRECIUDAD) VALUES (1, 'CALI');
INSERT INTO CIUDAD (IDECIUDAD, NOMBRECIUDAD) VALUES (2, 'TUNJA');
INSERT INTO CIUDAD (IDECIUDAD, NOMBRECIUDAD) VALUES (3, 'POPAYAN');
INSERT INTO CIUDAD (IDECIUDAD, NOMBRECIUDAD) VALUES (4, 'BOGOTA');
INSERT INTO CIUDAD (IDECIUDAD, NOMBRECIUDAD) VALUES (5, 'CARTAGENA');

INSERT INTO DETELECTOR (CEDULA, CIUDADELECCION) VALUES (1, 1);
INSERT INTO DETELECTOR (CEDULA, CIUDADELECCION) VALUES (2, 2);
INSERT INTO DETELECTOR (CEDULA, CIUDADELECCION) VALUES (3, 4);
INSERT INTO DETELECTOR (CEDULA, CIUDADELECCION) VALUES (4, 3);

COMMIT WORK;

La consulta:

Código SQL [-]
 
select a.*, b.*, c.*
from      elector    a
left join detelector b on (a.cedula         = b.cedula)
left join ciudad     c on (b.ciudadeleccion = c.ideciudad)

El primer left join es una union que te va a mostrar los datos de la tabla A asi su cedula no tenga ocurrencias en la tabla B.

Debes colocar un segundo left join, porque si colocas inner join no te arrojara registros para las personas que no tienen ciudad.

Si tu diseño cambiara y eliminas la tabla DETELECTOR la consulta quedaria

Código SQL [-]
 
select a.*, b.*
from       elector    a
left  join ciudad     b on (a.ciudadeleccion = b.ideciudad)

Espero te sea de utilidad
__________________
Luis Fernando Buelvas T.
Responder Con Cita
  #5  
Antiguo 28-11-2005
Luis Castillo Luis Castillo is offline
Miembro
 
Registrado: jun 2003
Ubicación: Colombia
Posts: 102
Poder: 21
Luis Castillo Va por buen camino
Muchas Gracias....

Bueno Luis Fernando.....dejame regalarte unas cuantas palabras...

Es admirable el empeño que pones para ayudar a la gente en este contexto....en este caso a mi. Fue una explicacion muy detallada y clara. Que resolvio mi problema.


Sobre la cuestion que comentabas de la unica ciudad para elegir.....la estructura de que puse solo una muestra que imitaba lo que en realidad estoy trabajando....no es asi en realidad....

En realidad el problema es que no se todavia el funcionamiento total del JOIN. Es por eso mi duda. Pero veo que eres un TESO en SQL .....dame una ayudita....tienes algun tutor....yo estoy empezando en INTERBASE



Muchisimas Gracias
__________________
LK
Responder Con Cita
  #6  
Antiguo 28-11-2005
lbuelvas lbuelvas is offline
Miembro
 
Registrado: may 2003
Ubicación: Colombia
Posts: 377
Poder: 22
lbuelvas Va por buen camino
Muchas gracias,

Sobre el SQL te recomiendo un libro que es gratuito y abarca aspectos basicos y avanzados de SQL, lo consigues en

http://www.managedtime.com/freesqlbook.php3

Sin embargo el SQL es una herramienta que ayuda a simplicar el trabajo con los datos, mas importante que esto es tener una buena fundamentacion en el diseño de bases de datos para sacar un maximo aprovechamiento al SQL.

Si deseas conocer aspectos avanzados de diseño de bases de datos como el modelamiento en el tiempo (tema que me apasiona), te recomiendo el libro:

Oracle8. Diseño de Bases de Datos con UML
Paul Dorsey, Hudicka
McGraw-Hill, 1999

Otro libro interesante son los que se reciben en los cursos de Capacitacion de Oracle (no he estado en ninguno) y en especial si puedes bajar por kazaa (y me excuso porque este libro no es gratis)

Oracle - Data Modeling and Relational Database Design.pdf

Exitos en tu viaje con interbase, claro que si no estas amarrado a trabajar con Interbase te recomiendo trabajar mejor con Firebird.
__________________
Luis Fernando Buelvas T.
Responder Con Cita
  #7  
Antiguo 28-11-2005
Luis Castillo Luis Castillo is offline
Miembro
 
Registrado: jun 2003
Ubicación: Colombia
Posts: 102
Poder: 21
Luis Castillo Va por buen camino
Ok....

Bueno luis Fernando......

Muy valios informacion........

No se por que soy tan indeciso en ciertas cosas....ahora me has puesto cabezon con lo de FIREBIRD.....hablame de el y porque me recomiendas usarlo mas que interbase....


gracia.s..
__________________
LK
Responder Con Cita
  #8  
Antiguo 29-11-2005
lbuelvas lbuelvas is offline
Miembro
 
Registrado: may 2003
Ubicación: Colombia
Posts: 377
Poder: 22
lbuelvas Va por buen camino
Bueno no soy la persona en este club con mas experiencia en Firebird, el duro para mi es Kinobi, quien gracias a su ayuda pude resolver una serie de dificultades hace algunos años que me encaminaron de mejor manera hacia Firebird.

Resulta que hago software para clientes cuya capacidad economica no les permite darse el lujo de adquirir un motor comercial como Oracle o SQL Server. Por otro lado, mySQL tiene un esquema de licencimiento dual, estoquiere decir que si uno va a vender un programa que haga uso de ese motor debe pagar una licencia que esta por el orden de US$495, lo que reduciria mis margenes de utilidad ya que en mi pais la gente mira mucho el precio y no la calidad, en resumen hay que vender barato.

Entonces me lance con el cuento inicialmente de Interbase 6.0.2 el cual fue lanzado Open Source por Borland (en ese momento Inprise ?) pero que finalmente esta compañia volvio a ofrecerlo comercialmente.

Bueno, un grupo de programadores siguieron el cuento y crearon a partir de Interbase una linea de desarrollo que llamaron Firebird. Para hacer el cuento mas corto, la ultima version de Firebird 1.5.2 es muy eficiente, con un lenguaje para procedimientos y triggers excelente que me ha ayudado a mi y a personas con las que hago proyectos especiales a reducir de manera sustancial los tiempos de entrega a nuestros clientes. La gran ventaja es que puedes instalarlo en tus clientes sin pagar licencias (claro que puedes apoyar a la fundacion que esta tras el proyecto http://firebird.sourceforge.net)

Lo bueno es que se vienen para el año 2006 varias actualizaciones interesantisimas. La primera es la correccion de algunos defectos en Firebird 1.5.2 y se llamara Firebird 1.5.3. La segunda, se lanzara Firebird 2.0 y Vulcano. La tercera es que a finales de 2006 se lanzara Firebird 3.0.

Las caracteristicas estan en

http://firebird.sourceforge.net/deve...admap2006.html

Razones suficientes para utilizarlo en todo tipo de proyectos.
__________________
Luis Fernando Buelvas T.
Responder Con Cita
  #9  
Antiguo 29-11-2005
Luis Castillo Luis Castillo is offline
Miembro
 
Registrado: jun 2003
Ubicación: Colombia
Posts: 102
Poder: 21
Luis Castillo Va por buen camino
Ok.....

Ok Luis....muy buena tu informacion.....Parece ser que Firebird es algo muy bueno....especialmente por el precio...

Visite la pagina que me diste :http://firebird.sourceforge.net

Y veo que estan disponibles tantas versiones y elementos de firebird que debido a mi ignorancia no se cual descargar.....yo tengo window xp y quiero empezar a trabajar en FireBird como lo estoy haciendo con Interbase (creando bases de datos, usuarios, DML etc....)

Cual es entonces.....

-firebird-addons FbConfigManager for v1.5
-firebird-win32 1.5.2-Release
-firebird-ODBC-driver 1.2-Release
-firebird 1.5.2-Release (Source)
etc......

Luis Castillo

PD: Por alli te mande un correo....
__________________
LK
Responder Con Cita
  #10  
Antiguo 30-11-2005
lbuelvas lbuelvas is offline
Miembro
 
Registrado: may 2003
Ubicación: Colombia
Posts: 377
Poder: 22
lbuelvas Va por buen camino
En la pagina http://www.ibphoenix.com al lado izquierdo hay una seccion Downloads y dentro de ella Main Downloads, alli se encuentran bien organizados por versiones los instaladores del motor tanto para Linux como para Windows. Te recomiendo esa pagina, sale casi a diario noticias sobre el motor.

Te recomiendo empezar con la version 1.5.2 es la version oficilamente estable y que puedes utilizar en produccion con tus clientes.

Algo que olvidaba, tus bases de datos van a trabajar perfectamente bien con Firebird pero es recomendable que tomes las bases de datos de Interbase y les hagas backup con gbak o desde la herramienta administrativa que utilices, despues desinstales Interbase, elimina manualmente el archivo gds32.dll que esta en Windows\System32, reinicies la maquina, instales luego Firebird, deja la opcion Legacy Applications y si estas en Windomws XP reinicia la maquina, luego restaura las copias de las bases de datos y listo.

Exitos en la tarea.
__________________
Luis Fernando Buelvas T.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 00:36:20.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi