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: 22
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: 22
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: 22
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
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 01:16:57.


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