Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 14-12-2017
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
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.
Responder Con Cita
  #2  
Antiguo 14-12-2017
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.021
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Código SQL [-]
select distinct(campo)
Responder Con Cita
  #3  
Antiguo 14-12-2017
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.732
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
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
Responder Con Cita
  #4  
Antiguo 14-12-2017
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
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 Ver Mensaje
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.
Responder Con Cita
  #5  
Antiguo 14-12-2017
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola.
Cita:
Empezado por Angel.Matilla Ver Mensaje
...
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
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #6  
Antiguo 14-12-2017
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.732
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
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
Responder Con Cita
  #7  
Antiguo 14-12-2017
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.732
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
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

Última edición por duilioisola fecha: 14-12-2017 a las 16:50:51.
Responder Con Cita
  #8  
Antiguo 14-12-2017
WHILENOTEOF WHILENOTEOF is offline
Miembro
 
Registrado: mar 2008
Posts: 229
Poder: 17
WHILENOTEOF Va camino a la fama
Cita:
Empezado por duilioisola Ver Mensaje
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

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
Responder Con Cita
  #9  
Antiguo 14-12-2017
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.021
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por WHILENOTEOF Ver Mensaje
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
Es la hija del presidente
Responder Con Cita
  #10  
Antiguo 14-12-2017
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
Cita:
Empezado por WHILENOTEOF Ver Mensaje
Interesante lo del LIST, ... tantos años usando Firebird y ahora descubro ese comando
Yo tampoco lo conocía. De haberlo sabido antes me hubiera solucionado bastantes problemas. Gracias
Cita:
Empezado por WHILENOTEOF Ver Mensaje
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
Es lo que tienen los partidos políticos. Eso sí: por lo menos pagan.
Cita:
Empezado por Casimiro Notevi Ver Mensaje
Es la hija del presidente
Responder Con Cita
  #11  
Antiguo 15-12-2017
cloayza cloayza is offline
Miembro
 
Registrado: may 2003
Ubicación: San Pedro de la Paz, Chile
Posts: 910
Poder: 22
cloayza Tiene un aura espectacularcloayza Tiene un aura espectacular
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
Responder Con Cita
  #12  
Antiguo 15-12-2017
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
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
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 15-12-2017 a las 21:43:11.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Consulta complicada... sargento elias SQL 2 10-03-2009 18:52:52
Consulta complicada superhopi MS SQL Server 15 04-07-2006 00:53:59
Estructura complicada alastor Varios 5 28-06-2006 19:42:40
Pregunta complicada... oliverinf OOP 6 24-09-2004 14:24:50
Consulta Complicada NickName SQL 6 29-04-2004 08:33:31


La franja horaria es GMT +2. Ahora son las 20:12:27.


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