Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Select complicada (https://www.clubdelphi.com/foros/showthread.php?t=92635)

Angel.Matilla 14-12-2017 12:42:57

Select complicada
 
Primero disculparme por el título del hilo; no se me ocurre otra forma.

Veamos. Para mi se me hace complicado como hacer este select. Tengo dos tablas relacionadas: una de personas y otra de cargos. Cada entrada de esta última ha de estar necesariamente en la de personas pero cada persona puede tener más de una entrada en la tabla de cargos.

A la izquiera la tabla de personas; a la derecha la de electos. Si yo hago un select para sacar, por ejemplo, la identidad y el cargo lo haría así:
Código:

SELECT A.Apellidos, A.Nombre, C.Cargo
FROM Persona A, Electos B, Cargos C
WHERE A.Codigo = B.Codigo AND B.Cargo = C.Codigo

Pero así me sacaría del código 32 de la imagen anterior tres líneas. ¿Cómo haría para que me saliera únicamente una línea por cada persona, al margen de cuantas entradas haya para la misma en esta otra tabla? No sé si me he explicado.

Casimiro Notevi 14-12-2017 12:49:59

Código SQL [-]
select distinct(campo)

duilioisola 14-12-2017 13:10:42

Entiendo que de la tabla ELECTOS quieres saber:
- el nombre y aplellido que están en la tabla PERSONA
- un Cargo que está en la tabla CARGOS

Una persona puede tener muchos Cargos
El campo Codigo relaciona Persona con Cargos

No me queda claro que el campo Cargo de ELECTOS se relaciones con el campo Codigo de CARGOS. Creo que debería ser Cargo de ELECTOS

Código SQL [-]
SELECT P.Apellidos, P.Nombre, C.Cargo
FROM Persona P, Electos E, Cargos C
WHERE 
P.Codigo = E.Codigo AND 
E.Cargo = C.Cargo

De todos modos, creo que hay que agregar la relación entre codigo Y cargo de ambas tablas.
Supongo que la tabla ELECTOS tiene tanto el código de la persona como el cargo al que ha sido electo.
Código SQL [-]
SELECT P.Apellidos, P.Nombre, C.Cargo
FROM Persona P, Electos E, Cargos C
WHERE 
P.Codigo = E.Codigo AND 
E.Codigo = C.Codigo AND
E.Cargo = C.Cargo

Angel.Matilla 14-12-2017 13:35:55

Después de poner el mensaje me he dado cuenta que he liado el ejemplo. Lo importante son las dos tablas de las imágenes; la tercera (Cargos) es para extraer la descripción asociada al campo Cargo en la segunda imagen.

Centrándome en las dos imágenes que he subido (Persona es la de la izquierda y Electos la de la derecha). Si uso un query parecido al que he puesto antes:
Código SQL [-]
SELECT A.Apellidos, A.Nombre, B.Cargo FROM Persona A, Electos B WHERE A.Codigo = B.Codigo

Saldría algo así:
Cita:

ABARCA CHAPARRO PLACIDA 21
ABENGOZAR FERNANDEZ ARROYO MARGARITA 45
ABENGOZAR FERNANDEZ ARROYO MARIA JULIA 29
ABENGOZAR FERNANDEZ ARROYO MARIA JULIA 21
ABENGOZAR FERNANDEZ ARROYO MARIA JULIA 45
AGUADO MADRID INOCENCIA 21

etc.
Y yo lo que necesito es que me salga algo así:
Cita:

ABARCA CHAPARRO PLACIDA 21
ABENGOZAR FERNANDEZ ARROYO MARGARITA 45
ABENGOZAR FERNANDEZ ARROYO MARIA JULIA 29
AGUADO MADRID INOCENCIA 21

etc.
Me da lo mismo si en los registros con más de una posibilidad sale el primero o el último. Sacar luego la descripción para ese valor es sencillo y no me preocupa.
Cita:

Empezado por Casimiro Notevi (Mensaje 523441)
select distinct(campo)

No me vale Casimiro. Así seguro que me salen todos los posibles; el distinct y el first 1 ya los he probado.

ecfisa 14-12-2017 14:51:59

Hola.
Cita:

Empezado por Angel.Matilla (Mensaje 523444)
...
No me vale Casimiro. Así seguro que me salen todos los posibles; el distinct y el first 1 ya los he probado.

No estas explicando o no estoy entendiendo bien la lógica que debe aplicar la selección, por que por ejemplo, usando DISTINCT sobre tus datos,
Código SQL [-]
SELECT DISTINCT P.CODIGO, P.APELLIDO, P.NOMBRE, E.CARGO
FROM PERSONAS P 
INNER JOIN ELECTOS E ON P.CODIGO = E.CODIGO
tenemos:
Código:

CODIGO        APELLIDO          NOMBRE        CARGO
---------------------------------------------
9        ABARCA CHAPARRO          PLACIDA        21
31        ABENGOZOAR FERN          MARGARITA        45
32        ABENGOZOAR FERN          MARIA JULIA        29
75        AGUADO MADRID          INOCENCIA        21
79        AGUDO HUESCAR          ANTONIO        39
117        ALAMINOS SALMER          LAURA                29
163        ALARCON JIMENEZ          JOSE LUIS        29

Donde visiblemente se obtiene solo un cargo por persona.

Lo que no termino de entender es a que te refieres con que "salen todos los posibles", ¿ Que criterio más se debería cumplir ?

Saludos :)

duilioisola 14-12-2017 15:36:08

Para esto tienes que hacer entonces un subselect:

Código SQL [-]
SELECT P.APELLIDOS, P.NOMBRE,
       (SELECT FIRST 1 CARGO
        FROM CARGOS
        WHERE
        CODIGO = E.CODIGO AND
        CARGO = E.CARGO
        ORDER BY CARGO) AS PRIMER_CARGO
FROM PERSONA P, ELECTOS E
WHERE
P.CODIGO = E.CODIGO

duilioisola 14-12-2017 15:46:54

En Firebird puedes utilizar tambié LIST() para estos campos agregados:

Código SQL [-]
/* LIST(CAMPO, SEPARADOR) devuelve un blob de valores separados por SEPARADOR */
SELECT P.APELLIDOS, P.NOMBRE, LIST(C.CARGO, ', ') AS LISTA_CARGOS
FROM PERSONA P, ELECTOS E, CARGOS C
WHERE
P.CODIGO = E.CODIGO AND
E.CODIGO = C.CODIGO AND
E.CARGO = C.CARGO   
GROUP BY P.APELLIDOS, P.NOMBRE

Código SQL [-]
APELLIDOS                  NOMBRE         LISTA_CARGOS
------------------------------------------------------
ABARCA CHAPARRO            PLACIDA        21
ABENGOZAR FERNANDEZ ARROYO MARGARITA      45
ABENGOZAR FERNANDEZ ARROYO MARIA JULIA    29, 21, 45
AGUADO MADRID              INOCENCIA      21

WHILENOTEOF 14-12-2017 17:19:58

Cita:

Empezado por duilioisola (Mensaje 523453)
En Firebird puedes utilizar tambié LIST() para estos campos agregados:

Código SQL [-]
/* LIST(CAMPO, SEPARADOR) devuelve un blob de valores separados por SEPARADOR */
SELECT P.APELLIDOS, P.NOMBRE, LIST(C.CARGO, ', ') AS LISTA_CARGOS
FROM PERSONA P, ELECTOS E, CARGOS C
WHERE
P.CODIGO = E.CODIGO AND
E.CODIGO = C.CODIGO AND
E.CARGO = C.CARGO   
GROUP BY P.APELLIDOS, P.NOMBRE

Código SQL [-]
APELLIDOS                  NOMBRE         LISTA_CARGOS
------------------------------------------------------
ABARCA CHAPARRO            PLACIDA        21
ABENGOZAR FERNANDEZ ARROYO MARGARITA      45
ABENGOZAR FERNANDEZ ARROYO MARIA JULIA    29, 21, 45
AGUADO MADRID              INOCENCIA      21

Interesante lo del LIST, ... tantos años usando Firebird y ahora descubro ese comando :eek:

Yo me iba a decantar por hablar seriamente con el presidente y hacerle ver que no es admisible que haya electos que acumulen más de un cargo :D

Casimiro Notevi 14-12-2017 17:35:19

Cita:

Empezado por WHILENOTEOF (Mensaje 523459)
Yo me iba a decantar por hablar seriamente con el presidente y hacerle ver que no es admisible que haya electos que acumulen más de un cargo :D

Es la hija del presidente :p

Angel.Matilla 14-12-2017 19:12:04

Cita:

Empezado por WHILENOTEOF (Mensaje 523459)
Interesante lo del LIST, ... tantos años usando Firebird y ahora descubro ese comando :eek:

Yo tampoco lo conocía. De haberlo sabido antes me hubiera solucionado bastantes problemas. Gracias
Cita:

Empezado por WHILENOTEOF (Mensaje 523459)
Yo me iba a decantar por hablar seriamente con el presidente y hacerle ver que no es admisible que haya electos que acumulen más de un cargo :D

:D Es lo que tienen los partidos políticos. Eso sí: por lo menos pagan.
Cita:

Empezado por Casimiro Notevi (Mensaje 523460)
Es la hija del presidente :p

:D:D

cloayza 15-12-2017 18:27:17

Estimados amigos, mi ánimo no es incomodar sino de sugerir.

Le recomiendo leer la documentación que trae consigo Firebird, especialmente la contenida en c:\Program Files\Firebird\Firebird_2_5\doc\sql.extensions\.

Existe bastante información que nos permite dar una mirada distinta a las problematicas que afrontamos a diario en el desarrollo de nuestros sistemas.

Es cierto que en ocasiones el tiempo es escaso, pero de igual manera hay que hacer el esfuerzo.

En mi caso personal, en esta documentación he descubierto información que como dijo el estimado amigo
Cita:

WHILENOTEOF... tantos años usando Firebird y ahora descubro ese comando
fui descubriendo a medida que revisaba la documentación.

Un caluroso abrazo

ecfisa 15-12-2017 20:37:11

Hola.

Voy a sumar un enlace a la interesante sugerencia del amigo cloayza: The Firebird FAQ.

Saludos :)

Edito: Casi lo olvido... y también : Reference Manuals


La franja horaria es GMT +2. Ahora son las 08:13:37.

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