Ver Mensaje Individual
  #2  
Antiguo 28-11-2005
lbuelvas lbuelvas is offline
Miembro
 
Registrado: may 2003
Ubicación: Colombia
Posts: 378
Reputación: 24
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